本記事では、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 200grep の基本例
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行を分解してフィールド番号を確認」するところから始めましょう。

コメント