サーバサイドログ解析に必須!grep / sed / awk(gawk)実践まとめ【入力例・実行結果付き】


本記事では、grep / awk を使ったログ解析について、
実際のログ例とコマンド実行結果をセットで紹介します。

「コマンドは分かるけど、どんなログにどう効くのか分からない」という人向けの内容です。


サンプルログについて

以降の例では、以下のようなログを使います。

アプリケーションログ(app.log)

2025-01-20 12:00:01 INFO  User login success user_id=1001
2025-01-20 12:03:12 ERROR Database connection failed
2025-01-20 12:05:45 WARN  Cache miss key=user:1002
2025-01-20 12:07:10 ERROR Timeout while calling external API
2025-01-20 13:01:22 INFO  User logout user_id=1001

アクセスログ(access.log)

2025-01-20 12:00:01 192.168.1.10 GET /index.html 200
2025-01-20 12:01:15 192.168.1.11 POST /login 302
2025-01-20 12:05:33 192.168.1.10 GET /api/data 500
2025-01-20 12:30:45 192.168.1.12 GET /index.html 200
2025-01-20 13:10:02 192.168.1.10 GET /logout 200

grep の基本例

ERROR を含む行を抽出する

コマンド

grep "ERROR" app.log

実行結果

2025-01-20 12:03:12 ERROR Database connection failed
2025-01-20 12:07:10 ERROR Timeout while calling external API

行頭が ERROR / WARN で始まるログを抽出する

コマンド

grep -E '^(ERROR|WARN)' app.log

※ 今回のログでは該当なし(行頭は日付のため)


特定の IP アドレスのアクセスを抽出する

コマンド

grep '192.168.1.10' access.log

実行結果

2025-01-20 12:00:01 192.168.1.10 GET /index.html 200
2025-01-20 12:05:33 192.168.1.10 GET /api/data 500
2025-01-20 13:10:02 192.168.1.10 GET /logout 200

awk の基本例

特定のフィールドを抽出する

アクセスログの構造:

$1: 日付
$2: 時刻
$3: IPアドレス
$4: HTTPメソッド
$5: パス
$6: ステータスコード

IP アドレス(3フィールド目)を抽出

コマンド

awk '{print $3}' access.log

実行結果

192.168.1.10
192.168.1.11
192.168.1.10
192.168.1.12
192.168.1.10

ERROR を含む行のみ表示

コマンド

awk '/ERROR/ {print}' app.log

実行結果

2025-01-20 12:03:12 ERROR Database connection failed
2025-01-20 12:07:10 ERROR Timeout while calling external API

複数条件(ERROR かつ Timeout)

コマンド

awk '/ERROR/ && /Timeout/ {print}' app.log

実行結果

2025-01-20 12:07:10 ERROR Timeout while calling external API

ステータスコードが 500 のアクセスを抽出

コマンド

awk '$6 == 500 {print}' access.log

実行結果

2025-01-20 12:05:33 192.168.1.10 GET /api/data 500

時間帯でログを抽出する

12:00〜12:59 のアクセス

コマンド

awk '$2 >= "12:00:00" && $2 <= "12:59:59" {print}' access.log

実行結果

2025-01-20 12:00:01 192.168.1.10 GET /index.html 200
2025-01-20 12:01:15 192.168.1.11 POST /login 302
2025-01-20 12:05:33 192.168.1.10 GET /api/data 500
2025-01-20 12:30:45 192.168.1.12 GET /index.html 200

集計系の例

日付ごとのアクセス数を集計

コマンド

awk '{print $1}' access.log | sort | uniq -c

実行結果

5 2025-01-20

IP アドレスごとのアクセス数

コマンド

awk '{print $3}' access.log | sort | uniq -c | sort -nr

実行結果

3 192.168.1.10
1 192.168.1.12
1 192.168.1.11

行の一部を抽出する(substr)

ログの先頭10文字(=日付)を抽出

コマンド

awk '{print substr($0, 1, 10)}' app.log

実行結果

2025-01-20
2025-01-20
2025-01-20
2025-01-20
2025-01-20

grep × awk の組み合わせ

ERROR ログの時刻だけを抽出

コマンド

grep ERROR app.log | awk '{print $2}'

実行結果

12:03:12
12:07:10

まとめ

grep / awk は、
「ログを見る → 絞る → 抜き出す → 数える」を高速に回すための最強ツールです。

  • grep:行を減らす
  • awk:構造を理解して加工・集計する

ログ解析に詰まったら、
まずは 「1行を分解してフィールド番号を確認」するところから始めましょう。

コメント

タイトルとURLをコピーしました