# 実例 2 — 100,000 行の Apache ログを bash パイプで解析

第 10 章「AIに任せる仕事を見極める」の **2 番目の角度**:
**ログ解析はエージェントを呼ばず bash パイプ**。

## 章のどの主張に対応するか

> Linux コマンドラインでの一括処理 ── AI 利用料ゼロ。
> 同じ処理を AI エージェントに頼むと、約 60 分、AI 利用料約 $5。**1,200 倍の速さ**。

(章本文「実例: 数字で見る」より)

example-1 が「画像 1,000 枚を WebP 化」(I/O ヘビーな繰り返し処理)、
これは **テキスト処理の繰り返し** ── ログ解析を実演する。

## やること

100,000 行(約 18 MB)の Apache combined log を生成して、6 種類の業務的な
クエリを `awk + sort + uniq` のパイプで解く:

| クエリ | 内容 |
|--------|------|
| Q1 | 総リクエスト数 + ステータスコード分布 |
| Q2 | アクセス上位 10 IP |
| Q3 | 5xx エラーが起きた時間帯 |
| Q4 | 404 になった URL 上位 10 |
| Q5 | 攻撃疑いの IP(複数の攻撃 URL を試行) |
| Q6 | 1 分間のリクエスト数推移 |

すべて **0.04〜0.1 秒** で完了。

## 構成

```
example-2/
├── README.md
├── generate_log.py    ── 100,000 行のサンプルログ生成
├── Makefile           ── 6 クエリの bash パイプ
├── results.md
├── access.log         ── 入力 (約 18 MB, .gitignore)
└── out/
    ├── q1-status.txt
    ├── q2-top-ips.txt
    ├── q3-5xx-hours.txt
    ├── q4-404-paths.txt
    ├── q5-attackers.txt
    └── q6-rps.txt
```

## 実行

```bash
make clean && make all
```

## なぜこれが「実例」になるのか

「ログから攻撃者を見つけて」「エラーの傾向を集計して」── これは
**典型的に AI エージェントに頼みたくなる作業**。でも:

**エージェント方式**(参考):

1. 100,000 行のログをコンテキストに渡す → コンテキスト窓を超える
2. ファイルを部分的に読ませる → 順次読みで遅い
3. グレッパー的なツール呼び出しを LLM が書く → どうせ awk/grep
4. 結果を集計させる → ハルシネーション(数値の)
5. 1 回 60 分 / $5

**bash パイプ方式**(このフォルダ):

```bash
awk '$9 ~ /^5/ {print substr($4, 14, 5)}' access.log | sort | uniq -c | sort -rn | head
```

- LLM を呼ばない
- 100,000 行を **0.04 秒で集計**
- LLM のハルシネーションが**起きない**(awk は嘘をつかない)
- そのまま cron に登録できる

これが章で言う「**コードに凍結する**」の典型例。

## 「LLM を呼ぶべき場合」との境界

```bash
# LLM を呼ばない:集計、フィルタ、上位 N 抽出
awk '$9 == 500' access.log | wc -l    # 5xx の件数
sort | uniq -c | sort -rn              # ランキング

# LLM を呼ぶべき:意図の判断、自然言語の要約
# 例: 「攻撃ログを見て、何の脆弱性を狙っているか教えて」
# → 攻撃 URL のパターン(`/.env`, `/wp-login.php`...)を Claude が解釈
```

**集計はコード、解釈は AI** ── これが境界。
このフォルダは集計側を最小実装で示す。
