[Apache] コマンドラインでアクセスログを解析するワンライナー
花粉ハンパねぇ~~、こんにちは nakamura です。いい加減花粉症で死人が出るんじゃないかと心配です。
今日はコマンドラインで Apache アクセスログを解析する際のコマンド例をいくつかご紹介します。最近は Google Analytics を始めフリーで多機能な解析ツールがたくさんありますが、ちょっとしたアクセスを追跡したい場合、簡単な数字をその場でちゃちゃっと出したい場合などログファイルを直接解析しちゃった方が早いし楽ですよ~。
ちなみに今回ご紹介するコマンド例は全ていわゆる combined な形式のログを対象としています。combined がよく分からない人は この辺り を参照してください。実際にはこんな感じの形式です。
192.168.0.10 - - [09/Mar/2011:00:00:08 +0900] "GET /blog/wsg/css/reset.css HTTP/1.1" 200 1275 "http://c-brains.jp/blog/wsg/css/style.css" "Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15 ( .NET CLR 3.5.30729)"
スペース区切りで取れる値と、ダブルクオテーション区切りじゃないと取れない値があるのが面倒ですねぇ。
コマンド例
ではでは実際のコマンド例です。
特定の IP からのアクセスだけを抽出したい
こんな感じでいけます。
grep "^192.168.0.10" /var/log/httpd/access_log
上記から画像やら CSS やらへのアクセスを除外したい
grep の -v オプションを使っていけます。
grep "^192.168.0.10" /var/log/httpd/access_log | grep -ive "GET /.*\.\(css\|js\|jpg\|gif\|png\|swf\|ico\)\ HTTP"
tail と組み合わせる事で特定の IP からのアクセスをリアルタイムに監視できます。
tail -f /var/log/httpd/access_log | grep "^192.168.0.10" | grep -ive "GET /.*\.\(css\|js\|jpg\|gif\|png\|swf\|ico\)\ HTTP"
アクセス元 IP の一覧が知りたい
IP アドレスはログの先頭に書かれているのでその部分だけ切り出して加工します。
cat /var/log/httpd/access_log | cut -d " " -f 1 | sort | uniq
ユーザエージェントの一覧が知りたい
ユーザエージェントは文字列中にスペースを含むのでダブルクオテーション区切りで切り出します。
cat /var/log/httpd/access_log | awk -F '"' '{ print $6 }' | sort | uniq
IP よりも文字列が長いので sort, uniq あたりの処理に少し時間が掛かると思いますがグッと耐えてください。
ブラウザ毎のアクセス数が知りたい
めっちゃ簡易的な解析ですが。大体の比率はこれで分かると思います。
for UA in MSIE Firefox Chrome; do COUNT=`grep "$UA" /var/log/httpd/access_log | wc -l`; echo "$UA : $COUNT"; done
終わりに
結局のところ grep, cut, awk, sort, uniq, wc 辺りの組み合わせでどうとでもなるので用途にあわせて色々と試してみてください。まだまだ色んな事ができますよ!