データのカウントと集計
AWK は、出現回数のカウントやデータの集計に非常に優れています。ここでは、各 HTTP ステータスコードのリクエスト数をカウントするために AWK を使用します。
次のコマンドを実行します:
awk '{count[$6]++} END {for (code in count) print code, count[code]}' server_logs.txt | sort -n
このコマンドは少し複雑なので、ステップバイステップで解説します:
-
{count[$6]++}
- 各行に対して実行される主要なアクションです:
count
は、作成する配列(連想配列または辞書)です。
[$6]
は、6 番目のフィールド(ステータスコード)の値を配列のインデックス/キーとして使用します。
++
はインクリメント演算子で、現在の値に 1 を加えます。
- つまり、各行に対して、見つかった特定のステータスコードのカウンターをインクリメントします。
-
END {for (code in count) print code, count[code]}
- すべての行を処理した後に実行されます:
END
は、入力の終わりに一致する特殊なパターンです。
{...}
は、すべての入力が処理された後に実行するアクションを含みます。
for (code in count)
は、count
配列のすべてのキーを反復処理するループです。
print code, count[code]
は、各ステータスコードとそのカウントを出力します。
-
| sort -n
- 出力を sort
コマンドにパイプし、数値的にソートします。
AWK が count[$6]++
のような配列を処理するとき、自動的に以下のことが行われます:
- 配列が存在しない場合は作成します。
- キーが存在しない場合は、値が 0 の新しい要素を作成します。
- その後、値を 1 増やします。
次のような出力が表示されるはずです:
200 3562
301 45
302 78
304 112
400 23
403 8
404 89
500 15
この集計結果を見ることで、ログファイル内のステータスコードの分布をすぐに把握できます。
次に、最も頻繁にアクセスされた上位 5 つのリソースを見つけましょう:
awk '{count[$5]++} END {for (resource in count) print count[resource], resource}' server_logs.txt | sort -rn | head -n 5
このコマンドは、いくつかの変更点を除いて似たパターンに従っています:
{count[$5]++}
- 5 番目のフィールド(要求されたリソース)の出現回数をカウントします。
END {for (resource in count) print count[resource], resource}
- すべての行を処理した後:
- まずカウントを出力し、その後にリソースを出力します。
- この順序の変更により、カウントで数値的にソートすることが容易になります。
| sort -rn
- 数値的に逆順にソートします(カウントが最も多いものから始まります)。
| head -n 5
- 出力を最初の 5 行(上位 5 つの結果)に制限します。
出力結果:
1823 /index.html
956 /about.html
743 /products.html
512 /services.html
298 /contact.html
これらの AWK コマンドは、配列を使用したカウントと集計の強力さを示しています。このパターンを適用して、データ内の任意のフィールドまたはフィールドの組み合わせをカウントすることができます。
たとえば、IP アドレスごとのリクエスト数をカウントするには:
awk '{count[$3]++} END {for (ip in count) print ip, count[ip]}' server_logs.txt
メソッドとステータスの両方でリクエストをカウントするには:
awk '{key=$4"-"$6; count[key]++} END {for (k in count) print k, count[k]}' server_logs.txt
これらの集計結果を利用することで、トラフィックパターンを理解し、サーバー上の人気のある(または問題のある)リソースを特定することができます。