アクセスログが下記のフォーマットだとすると(たぶんApacheのデフォルト設定だとこれ)、
access_log-YYYYMMDD
XXX.XXX.XXX.XXX - - [09/Feb/2014:14:47:20 +0000] "GET /test.php?txt=hoge HTTP/1.1" 200 4 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9) AppleWebKit/537.71 (KHTML, like Gecko) Version/7.0 Safari/537.71"
awkとsortとuniqコマンドで、次のように集計できる。
$ cat access_log-YYYYMMDD | awk -F\" '{print $2}' | awk -F' ' '{print $2}' | sort | uniq -c | sort -n -r
例えば結果はこんな感じ。
374 /hoge.php
265 /img/hoge.png
216 /css/hoge.css
23 /hoge.php?var=1
~以下つづく~
このコマンドの説明:
- まず awk で、 " で区切られた文字列の 2 番目を切り出す
- さらに awk で、スペースで区切られた文字列の 2 番目を切り出す
- ソートして重複行を削除。この際、uniq の -c オプションで重複した行数を出力
- 重複した行数(=アクセスカウント数)を降順に並びかえる。このとき -n を指定するのがポイント