對於apache日誌的統計分析,如分析URL排名,訪問IP統計排名等,使用Shell腳本來直接進行是一個非常高效的手段.
apache 訪問日誌形式如下:
192.168.102.135 - - [03/Jan/2012:10:49:58 -0500] "GET / HTTP/1.1" 200 44
如果統計訪問10名的IP地址,網絡流傳的方法通常是
#awk '{print $1}' access_log|sort|uniq -c|sort -k1 -nr|head
58569 192.168.102.240
6745 192.168.200.14
5785 192.168.102.135
668 ::1
43 192.168.102.54
1 172.16.1.2
我們來看一下這條命令的執行時間
time awk '{print $1}' access.log|sort|uniq -c|sort -k1 -nr|head
real 0m1.128s
user 0m1.089s
sys 0m0.031s
總共需要1.128秒。效率不算太高, 我們加以改進。
#awk '{s[$1]++}END{for (i in s) print s[i],i}' access.log|sort -k2 -nr|head
58569 192.168.102.240
6745 192.168.200.14
5785 192.168.102.135
668 ::1
43 192.168.102.54
1 172.16.1.2
real 0m0.052s
user 0m0.038s
sys 0m0.013s
總執行時間爲0.052秒,但結果不太易於觀察,我們column -t 下後
# time awk '{s[$1]++}END{for (i in s) print s[i],i}' access_log|sort -k2 -nr|head |column -t
58569 192.168.102.240
6745 192.168.200.14
5785 192.168.102.135
668 ::1
43 192.168.102.54
1 172.16.1.2
real 0m0.056s
user 0m0.033s
sys 0m0.022s
輸出結果與使用uniq -c一致,但執行時間從1.128s 一下提升到0.056秒,效率提升20倍, 可見使用uniq -c結合sort來統計字符串的出現次數是多少效率低下啊!