ログ解析とAWKコマンド

 今回はログ解析を行うときに、AWKコマンドを使いこなせると解析のハードルが少し下がるというお話です。

 毎週のように運用しているサイトのアクセスログを確認するのですが、これがログ解析ツールなどを使わない完全自己流での実施のため結構大変な思いをしています。私とawkコマンドの出会いは、アクセスログの中から、アクセス元IPの一覧を抽出したいと思い試行錯誤していた時です。grepコマンドを使って試行錯誤していたのですが、なかなか上手くいかず悩んでいた時に「こういうのって、awkコマンドを使えば簡単にできるんじゃなかったっけ?」とふと思い出しました。

 awkコマンドは簡単に言えば、空白やカンマといった区切り文字を含んだテキストファイルを加工・処理することを目的としたコマンドです。CSVファイルを加工・処理する時などに主に使われています。そして、アクセスログは一行一行の書式の仕様が統一されているので、まさにawkコマンドが得意とする領域なのです。

 例えば、以下のようなアクセスログがあったとします。

└─$ cat awk_accesslog.txt
example.jp 192.0.2.0 - - [11/Jul/2013:12:09:17 +0900] "GET /?action=hoge HTTP/1.0" 200 2602 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
example.jp 192.0.3.0 - - [11/Jul/2013:12:09:17 +0900] "GET / HTTP/1.0" 200 3000 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
example.jp 192.0.4.0 - - [11/Jul/2013:12:09:17 +0900] "GET /test_index HTTP/1.0" 200 4000 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
example.jp 192.0.5.0 - - [11/Jul/2013:12:09:17 +0900] "GET /test_index2 HTTP/1.0" 200 5000 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"

 このアクセスログの各行の仕様は以下のように、要素が空白で区切られた書式で統一されています。

バーチャルホスト[空白]IPアドレス[空白]クライアントユーザー名[空白]認証ユーザー名[空白]タイムスタンプ[空白]"メソッド URI+QUERY_STRING"[空白]・・・

 ではこのファイルから、IPアドレスを抽出したいと思います。awkコマンドでフィールド(区切り文字で区切られた各要素)を抽出する際の基本形はこちらです。

awk -F (区切り文字) '{print $(何フィールド目か)}' ファイル名

 今回IPアドレスは2フィールド目のため、コマンドは以下のようになります。

コマンド:awk -F " " '{print $2}' awk_accesslog.txt

└─$ awk -F " " '{print $2}' awk_accesslog.txt
192.0.2.0
192.0.3.0
192.0.4.0
192.0.5.0

 しっかりとIPアドレスだけ抽出することができました。

 今回は、awkコマンドを使ってアクセスログからIPアドレスを抽出するという、ごくごく簡単な使い方の一例を紹介しました。全てのLinuxコマンドを丸暗記する必要は無いですが、「こういうことをやりたいなー」と思ったときに、「そういえば、あのコマンドだったらできた気がする」と気づけるかどうかはすごく大切だと思います。是非、多くのコマンドに触れてみてください。