Apacheのcombined形式のアクセスログから必要なフィールドを抽出するためのPerlのワンライナー

技術関係

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

参考先

タイトルとURLをコピーしました