access_logをawkコマンドで解析

いつもawkの使い方を忘れてしまうのでメモ。

access.log (sample)

192.168.0.1 - - [1/Apr/2015:00:00:00 +0900] "GET /hoge_1.html HTTP/1.1" 200 1234 "https://www.google.co.jp/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36"
192.168.0.1 - - [1/Apr/2015:00:00:00 +0900] "GET /hoge_2.html HTTP/1.1" 200 1234 "https://www.google.co.jp/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36"
192.168.0.1 - - [1/Apr/2015:00:00:00 +0900] "GET /hoge_2.html HTTP/1.1" 200 1234 "https://www.google.co.jp/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36"
192.168.0.1 - - [1/Apr/2015:00:00:00 +0900] "GET /hoge_1.html HTTP/1.1" 200 1234 "https://www.google.co.jp/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36"
192.168.0.1 - - [1/Apr/2015:00:00:00 +0900] "GET /hoge_3.html HTTP/1.1" 200 1234 "https://www.google.co.jp/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36"
192.168.0.1 - - [1/Apr/2015:00:00:00 +0900] "GET /hoge_1.html HTTP/1.1" 200 1234 "https://www.google.co.jp/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36"

このサンプルaccess_logからアクセス数順に集計したいとき

cat access.log | awk '{ print $7 }'

/hoge_1.html
/hoge_2.html
/hoge_2.html
/hoge_1.html
/hoge_3.html
/hoge_1.html

awkコマンドはデフォルトでは半角空白をフィールドの区切りに用いる。
"(ダブルクォーテーション)で区切って下記のようにも出来る。

cat access.log | awk -F '"' '{ print $2 }' | awk '{print $2}'

/hoge_1.html
/hoge_2.html
/hoge_2.html
/hoge_1.html
/hoge_3.html
/hoge_1.html

ここからsortコマンドで抽出した文字列を並び替える

cat access.log | awk '{ print $7 }' | sort

/hoge_1.html
/hoge_1.html
/hoge_1.html
/hoge_2.html
/hoge_2.html
/hoge_3.html

そして最後に uniq -c でユニークにして件数を表示する

cat access.log | awk '{ print $7 }' | sort | uniq -c

   3 /hoge_1.html
   2 /hoge_2.html
   1 /hoge_3.html

※ 今回のサンプルaccess_logからuser_agentを抽出したい場合は
下記のコマンドで抽出できる

cat access.log | awk -F '"' '{ print $6 }' | sort | uniq -c

   6 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36


あまり普段使わないので忘れがちですが、awkのみの書籍もあるくらいなので
もっと勉強しなくてはと思う今日この頃。