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