パターンを使用して、現在のディレクトリにある最後のファイルの最初の行を印刷します。

パターンを使用して、現在のディレクトリにある最後のファイルの最初の行を印刷します。

1つのディレクトリに複数のログファイルがあり、パターンがあるvanished最後の行と一緒にこのファイルの最初の行を印刷したいと思います。

最初の行を印刷する前にログファイル名を印刷することもできますかawk*.logs

答え1

このような?

for f in *.logs; do tail -n 1 -- "$f" | grep -q vanished && { printf '%s: ' "$f"; head -n 1 -- "$f"; }; done

これを行うこともできますが、awkファイルの先頭と末尾のみを読み取る必要はありませんが、ファイル全体を読み取る必要があるため、ファイルが大きいと効率が悪くなります。

答え2

そうしたいなら、次のようにすればawk正しい方向に行くことができます。

for f in *.log; do awk 'NR==1{ first_line=$0 } END { last_line=$0; print( last_line ~ /varnished/) ? "File: " FILENAME "\n" first_line : "" }' "$f"; done

forループは必要ありませんが、awkを使用してこれを行うための最も効率的な方法です。

以下のコメントのおかげで、gawk次のように作業できます。

gawk 'FNR==1 {first = $0} ENDFILE {if($0 ~ /varnished/) print substr(FILENAME,3) ":", first}' ./*.log 

最近のLinuxシステムの場合はawk次のとおりですgawk。たとえば、最近の Fedora リリースの場合は次のようになります。

# ls -l /bin/awk 
lrwxrwxrwx. 1 root root 4 Jul 13 07:55 /bin/awk -> gawk

関連情報