Apache のアクセスログからページランキングを集計する超単純なワンライナー。マルチライナーかな?
ls access_log.* | while read LINE do FILENAME=`perl -lane '$F[3] =~ s/\[|:.*//g; $F[3] =~ s/\//-/g; print $F[3]; exit if $.>0' $LINE` perl -lane 'print $F[6];' $LINE > temp.1 sort temp.1 > temp.2 uniq -c temp.2 > temp.3 sort -nr temp.3 > $FILENAME.txt done
.js、.css、.gif なども入ってきて見づらいので除去した。
ls *.txt | while read LINE; do perl -i.org -wnl -e '/\.css$|\.js$|\.gif$/ or print;' $LINE done
さらにURLパラメータを削除した。
ls *.txt | while read LINE; do perl -i.org -ple 's/\?.*//' $LINE ; done
最終的にまとめると、
ls access_log.* | while read LINE do FILENAME=`perl -lane '$F[3] =~ s/\[|:.*//g; $F[3] =~ s/\//-/g; print $F[3]; exit if $.>0' $LINE` perl -lane 'print $F[6];' $LINE > temp.1 perl -wnl -e '/\.css$|\.js$|\.gif$/ or print;' temp.1 > temp.2 perl -ple 's/\?.*|;.*//' temp.2 > temp.3 sort temp.3 > temp.4 uniq -c temp.4 > temp.5 sort -nr temp.5 > $FILENAME.txt done
実行環境は OS X
$ uname -a Darwin *****-no-macbook-air.local 9.6.0 Darwin Kernel Version 9.6.0: Mon Nov 24 17:37:00 PST 2008; root:xnu-1228.9.59~1/RELEASE_I386 i386
追記(2009/03/27):
特定の時間帯のみ抽出する。
perl -lane 'print if ($F[3] =~ m/09:20:[0-3][0-4]$/);' access_log.1