AWK應用之統計訪問日誌

壹頁書發表於2015-02-28
Nginx和Apache都支援訪問日誌,可以記錄頁面請求的時間
統計頁面的訪問時間,可以作為調優的一種依據.

實驗模擬Nginx的訪問日誌,統計頁面訪問的各項數值.

首先建立模擬資料
create table t  
select 
concat('/cms/',ceil(rand()*5),'.html') path,
now()-interval id+ceil(rand()*60) minute createtime,
ceil(rand()*100) ts 
from nums where id<30;

其中nums是數字輔助表,參見
http://blog.itpub.net/29254281/viewspace-1362897/

將資料匯出為文字,模擬訪問日誌
select * from t into outfile '/tmp/log.txt';

資料如下,分別是訪問的頁面,訪問時間和訪問時長


1.統計訪問總時長(sum)
awk '{a[$1]+=$4} END{for (i in a) printf("%10s %5d\n",i,a[i])}' log.txt | sort



結果和資料庫統計是一樣的


2.統計頁面訪問次數
awk '{a[$1]+=1} END{for (i in a) printf("%10s %5d\n",i,a[i])}' log.txt | sort

3.統計最長訪問時間
awk '{if(a[$1]=="") a[$1]=$4; if(a[$1]>$4) a[$1]=$4} END{for (i in a) printf("%10s %5d\n",i,a[i])}' log.txt | sort

4.統計最短訪問時間
awk '{if(a[$1]=="") a[$1]=$4; if(a[$1]

5.統計平均訪問時間
awk '{s[$1]+=$4;c[$1]+=1} END{for (i in c) printf("%10s %5d\n",i,s[i]/c[i])}' log.txt | sort

6.統計一個時間段內的最大訪問時間
這個比較複雜,需要單獨寫一個指令碼檔案了
vim cal.awk

#!/bin/awk -f
{    
    dateStr = $2" "$3;  
    split(dateStr, dateStrArr, "[\\- :]");
    dateStr = "";
    for(i=1;i<=length(dateStrArr);i++) 
        dateStr = dateStr" "dateStrArr[i]; 
    if(mktime(dateStr)>mktime("2015 02 28 09 00 00") && mktime(dateStr)
    {
        if(a[$1]=="") a[$1]=$4; 
        if(a[$1]
    }
}
END {for (i in a) printf("%10s %5d\n",i,a[i])}



在資料庫中驗證


用awk處理時間比較麻煩,需要按照指定的格式拼湊mktime函式的引數.

參考:
http://www.cnblogs.com/chengmo/archive/2010/10/08/1845913.html
http://coolshell.cn/articles/9070.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1443562/,如需轉載,請註明出處,否則將追究法律責任。

相關文章