/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