Tips
コード例
`awk`は、テキストファイルをパターンに基づいて行ごとに処理し、特定のフィールドを抽出したり、集計したり、整形したりするための強力なコマンドラインツールです。ログ解析やデータ変換、レポート生成など、様々な場面でその真価を発揮します。
技術・言語・ツール: awk
awkは、テキストファイルをパターンに基づいて行ごとに処理し、特定のフィールドを抽出したり、集計したり、整形したりするための強力なコマンドラインツールです。ログ解析やデータ変換、レポート生成など、様々な場面でその真価を発揮します。
awkでログから特定のエラーを迅速に分析する
大量のログファイルから特定のエラーメッセージを抽出し、さらにその発生回数や時間帯ごとの傾向を素早く把握したい場合にawkは非常に有効です。複雑なスクリプトを書かずとも、パイプと組み合わせることで柔軟な分析が可能です。
コード例
まず、サンプルとなるログファイル sample.log を作成します。
cat << EOF > sample.log
2023-10-26 10:01:23 INFO User login successful: user_id=123
2023-10-26 10:02:15 ERROR Database connection failed: host=db1, port=5432
2023-10-26 10:03:01 INFO Data processed: count=100
2023-10-26 10:04:30 ERROR API request failed: /api/v1/data, status=500
2023-10-26 10:05:50 WARN Disk space low: /var/log, usage=90%
2023-10-26 10:06:10 ERROR Database connection failed: host=db2, port=5432
2023-10-26 11:01:23 INFO User login successful: user_id=456
2023-10-26 11:02:15 ERROR API request failed: /api/v1/users, status=401
2023-10-26 11:03:01 INFO Data processed: count=200
2023-10-26 11:04:30 ERROR Database connection failed: host=db1, port=5432
EOF
1. ERRORメッセージを含む行を抽出する
awkにパターン(/ERROR/)を渡すだけで、そのパターンにマッチする行を出力します。
awk '/ERROR/' sample.log
出力例:
2023-10-26 10:02:15 ERROR Database connection failed: host=db1, port=5432
2023-10-26 10:04:30 ERROR API request failed: /api/v1/data, status=500
2023-10-26 10:06:10 ERROR Database connection failed: host=db2, port=5432
2023-10-26 11:02:15 ERROR API request failed: /api/v1/users, status=401
2023-10-26 11:04:30 ERROR Database connection failed: host=db1, port=5432
2. ERRORの総数をカウントする
パターンにマッチした行ごとにカウンタをインクリメントし、すべての処理が終わった後に結果を出力します。
awk '/ERROR/ {count++} END {print "Total ERRORs:", count}' sample.log
出力例:
Total ERRORs: 5
3. 時間帯(時)ごとのERROR数を集計する
awkの連想配列を利用して、ログのタイムスタンプ(2番目のフィールド $2)から時間(時)を抽出し、それぞれの時間帯におけるエラー数をカウントします。
awk '/ERROR/ {
# タイムスタンプ($2)から時間(例: "10")を抽出
hour = substr($2, 1, 2);
# 時間帯ごとのエラー数をカウント
error_by_hour[hour]++;
}
END {
print "ERRORs by Hour:";
# 集計結果を時間でソートして出力
for (h in error_by_hour) {
print h ": " error_by_hour[h];
} | "sort -k1n"
}' sample.log
出力例:
ERRORs by Hour:
10: 3
11: 2
注意点やおすすめポイント
- フィールドセパレータ (
-F):awkはデフォルトでスペースやタブをフィールド区切り文字としますが、-F ","のように指定することでCSVファイルなどを処理できます。 - 組み込み変数:
$0は行全体、$1,$2, …はそれぞれのフィールドを表します。NFはフィールドの数、NRは行番号です。 - パターンとアクション:
awk 'パターン {アクション}'の形式で、特定のパターンにマッチした行に対してアクションを実行します。パターンを省略するとすべての行にアクションが適用されます。 BEGINとENDブロック:BEGINブロックはファイル処理の前に一度だけ実行され、ENDブロックはファイル処理の後に一度だけ実行されます。初期化や最終結果の出力に便利です。grepやsedと組み合わせて、より複雑なテキスト処理のパイプラインを構築することも可能です。