アクセスログの集計

/usr/local/apache/logs/access_log というファイルにWebサーバのアクセスログが入っています。

1行が1アクセス(ヒット)で,たとえば次のようになっています(実際は一つの行ですが,見やすいように4行に分けて書いてあります)。

123.45.67.89 - - [10/Jul/2002:15:17:42 +0900]
"GET / HTTP/1.1" 200 10744
"http://www.yahoo.co.jp/"
"Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; Win 9x 4.90)"

最初が閲覧したパソコンのIPアドレス,[ ] 内が日付,GET / はトップページ / を get したということ,http://www.yahoo.co.jp/ は一つ前のページ(いわゆる REFERER),残りはブラウザの種類などです。

Perl は perl -ane 'スクリプト' として起動したとき,各行を空白で分割して最初の要素を $F[0],次を $F[1] ……という変数(配列要素)に入れます(man perlrun-a を検索してください)。 そこで,次のようにすればトップページの閲覧ログだけ切り出すことができます。

cd /usr/local/apache/logs
perl -ane 'print if $F[6] =~ /^\/$/' access_log | less

最後の | less は1ページずつ止めるという意味です。 スペースキーを押せば次のページに進み,q を押せば less が終了します。

では私のページの閲覧だけ切り出すにはどうすればいいでしょうか。 ログを観察すると,/~okumura/…… となっている場合と /%7Eokumura/…… となっている場合があり,まれに /%7eokumura/…… というのもあります。 これは ~(チルダ)の16進コードが 7E だからです。 そこで,次のようにすればほぼ完璧でしょう。

perl -ane 'print if $F[6] =~ /^\/(~|%7[Ee])okumura\//' access_log | less

アクセス数をカウントするだけなら,| less| wc -l に変えます。


リンクはご自由にどうぞ。

松阪大学 奥村晴彦

Last modified: 2003-12-02 08:48:16