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
echo
2つのコマンドを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]
ワイルドカードパターンと一致するファイル名を指定します。
対話型シェルでない場合でも、次のことができますzsh
。zsh
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
インターネットで素早く検索して、使い方に関する素晴らしいチュートリアルをたくさん見つけてください。