Apacheのログをざっと見ていきたいときや、後で適当に使いまわせるような形式に変換したいとき用のPerlのワンライナー。
とりあえず標準出力から受け取ったApacheのログを正規表現で分割した配列を作成、後半部分で必要なフィールドを指定してTSV形式で出力している。必要なフィールドは状況に応じて変わるはずなので適当に対応する。以下の指定の場合、3 = アクセス時間、4 = リクエストURL、5 = ステータス、8 = ユーザエージェント。
$ cat access_log | perl -lne '@f = /^(.*?) (.*?) (.*?) \[(.*?)\] "(.*?)" (.*?) (.*?) "(.*?)" "(.*?)"/; print join("\t", @f[3,4,5,8]) ' > results.log real 5m35.772s user 2m51.358s sys 0m19.389s
別にパイプで受け取る必要ないなら、ファイル名を直接指定すればcat分の処理が浮く。
$ perl -lne '@f = /^(.*?) (.*?) (.*?) \[(.*?)\] "(.*?)" (.*?) (.*?) "(.*?)" "(.*?)"/o; print join("\t", @f[3,4,5,8])' access_log > results.log real 4m51.345s user 2m50.015s sys 0m11.999s
対象にしたログファイルはこんな感じ。
$ wc access_log 17801089 380728311 5173685848 access_log