ディレクトリ内の最新のファイルから文字列を検索する

ディレクトリ内の最新のファイルから文字列を検索する

grep現在のディレクトリの最新のファイルから文字列が必要です。次のコマンドを使用すると、最新のファイルを取得できますが、grepそのファイル内でのみ取得することはできません。

$ ls -lrth 

-rw-r--r--. 1 user pg_user 1712804 Jul 13 22:27 postgresql-2021-07-13_000000.log
-rw-r--r--. 1 user pg_user       0 Jul 14 00:00 postgresql-2021-07-14_000000.log

$ ls -lt postgresql-*.log | head -n 1 
-rw-r--r--. 1 user pg_user       0 Jul 14 00:00 postgresql-2021-07-14_000000.log

今私はgrep文字列が欲しいpostgresql-2021-07-14_000000.log

echo2つのコマンドを1つのコマンドにまとめて画面に出力するにはどうすればよいですか?それはまるで

$ls -lt postgresql-*.log | head -n 1 | grep "system is ready" 

(ここで何かが落ちたことを私だけが知っています。)

答え1

zshシェルの使用:

grep -F 'system is ready' postgresql-*.log(.om[1])

パターンは、postgresql-*.log(.om[1])現在のディレクトリで選択されているファイルと一致する一般的なワイルドカードパターン()と、ワイルドpostgresql-*.logカードパターンの動作を変更するワイルドカード修飾子((.om[1]))で構成されています。ワイルドカード修飾子はzshシェルにのみ適用されます。

ここで使用されるglobbing修飾子は、通常のファイル(.)のみを照合し、一致によって生成された名前のリストが変更タイムスタンプom()でソートされることを保証します。次に、ソートされた一致リストからを使用して最初の一致のみを抽出し、最後に変更された[1]ワイルドカードパターンと一致するファイル名を指定します。

対話型シェルでない場合でも、次のことができますzshzsh

zsh -c 'grep -F "system is ready" postgresql-*.log(.om[1])'

あなたが尋ねた後スクリプトこれを行うには:

#!/bin/zsh

grep -F 'system is ready' postgresql-*.log(.om[1])

関連:

答え2

xargsあなたが逃したのは命令のようです。たとえば、次のように使用できます。

ls -t postgresql-*.log | head -n 1 | xargs grep "system is ready" 

このxargsコマンドは、標準入力からコマンドラインを実行するために使用されます。この場合、コマンドgrepによるファイル出力となりますhead

これが正しく機能するために、-l元のファイルにこのフラグを含めないでくださいls。したがって、headコマンドの結果は追加情報が印刷されず、ファイル名のみになります-l

慣れていない場合は、xargsインターネットで素早く検索して、使い方に関する素晴らしいチュートリアルをたくさん見つけてください。

関連情報