[Linuxコマンド]forループとAWKを組み合わせてワンライナーでログをprint

まずはfor文を使ってループ時のindex値を表示

コマンド

 for i in {1..3}; do echo $i; done

結果

1
2
3

次に、複数ファイルの最後の行を部分的に出力

以下のような3つのインスタンスのログファイルがあったと仮定。

instance1.log
2021-03-07 18:14:52.824  INFO 200 OK
2021-03-07 18:14:52.827  ERROR 500 Internal Server Error
2021-03-07 18:14:52.856  INFO 200 OK

instance2.log
2021-03-07 18:14:52.824  INFO 200 OK
2021-03-07 18:14:52.827  ERROR 500 Internal Server Error
2021-03-07 18:14:52.856  INFO 200 OK

instance3.log
2021-03-07 18:14:52.777  INFO 200 OK
2021-03-07 18:14:52.807  INFO 200 OK
2021-03-07 18:14:52.828  ERROR 500 Internal Server Error

各ファイルの最終行の時刻、ログレベル、ステータスコードを出力する。

コマンド

for i in {1..3}; do awk 'END{print FILENAME " " $2 " " $3 " " $4}' instance$i.log; done

結果

instance1.log 18:14:52.856 INFO 200
instance2.log 18:14:52.825 INFO 200
instance3.log 18:14:52.828 ERROR 500

for i in {1..3}; で1から3までループさせる

awk ‘END{print FILENAME ” ” $2 ” ” $3 ” ” $4}の部分で最終行に対して、ファイル名とスペース区切りで2番目と3番目と4番目を出力する。ENDとFILENAMEはawkに用意されている組み込み変数。

instance$i.log の部分でループ時のindex値を使ってファイル名を指定

コメントを残す

メールアドレスが公開されることはありません。

ABOUT US
little
15年以上プログラマーをしているエンジニアです。Kotlin, Java, Python, C++を使用したServerSideの開発に携わってきました。とりあえずやってみるスタイルで記事を更新していきます。