標籤:
awk 19
一般來說流量頻寬是通過snmp協議取網卡流量畫圖。不過有的時候,為了最佳化分析或者排錯,也會直接去計算服務的訪問流量。方法很簡單,根據日誌中記錄的 請求時間(squid記錄的是請求響應完成時間,如果要精確,可以再減去回應時間,不過一般squid的檔案不至於5分鐘內還傳不完的……),按每5分鐘 一匯總其位元組數,然後均攤到300秒上。
計算全日誌中最高頻寬的命令列如下:
cat $ACCESS_LOG|awk -F‘[: ]‘ ‘{a[$5":"$6]+=$14}END{for(i in a){print i,a[i]}}‘|sort|awk ‘{a+=$2;if(NR%5==0){if(a>b){b=a;c=$1};a=0}}END{print c,b*8/300/1024/1024}‘
(日誌為標準apache日誌格式) 而把最後的awk改成’{a+=$2;if(NR%5==0){print $1,a*8/300/1024/1024;a=0}}’,就可以輸出每5分鐘時的流量值,然後用GD庫畫圖~~(有時間看看perl的GD:Graph 模組,應該不難)
案例:使用awk與sort -nr分析訪問日誌,找出每種請求返回狀態代碼的請求個數:
訪問日誌的檔案格式:
113.31.27.213 www.5iops.com – [15/Apr/2012:04:06:17 +0800] “GET /faq/ HTTP/1.0″ 200 2795 “-” “Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.2 Safari/535.11″ 118.119.120.248, 222.215.136.44 0.003 192.168.0.25:80 200 3.31
我們最常用的處理方式為:cat /home/logs/nginx/www.5iops.com.access.log|awk ‘{print $(NF-1)}’|sort -nr |uniq -c ,但其實,這個處理的效率較低:
time cat /home/logs/nginx/www.5iops.com.access.log|awk ‘{print $(NF-1)}’|sort -nr |uniq -c
1 200″
3 “404”
4 “304”
7377 “200”
48 “-”
real 0m0.107s
user 0m0.102s
sys 0m0.013s
time cat /home/logs/nginx/www.5iops.com.access.log|awk ‘{a[$(NF-1)]++} END{for (i in a) print i ” ” a[i]}’
“304” 4
“404” 3
“200” 7399
“-” 49
200″ 1
real 0m0.018s
user 0m0.013s
sys 0m0.008s
可見使用後面的awk處理效率高10倍~
另一個案例,用一行shell命令處理以下文本分析任務:
有一個文字檔,內容為每行為每隔5分鐘記錄的頻寬峰值,共一個月(共8640行),我需要計算出,每天的峰值並排序:
traffic檔案格式:
-bash-4.1$ cat traffic.txt|more
2012-04-01 00:00 1952.34mbps
2012-04-01 00:05 2198.34 mbps
2012-04-01 00:10 2117.07 mbps
2012-04-01 00:15 2104.83 mbps
2012-04-01 00:20 1878.73 mbps
…
一種常見解決方案:
-bash-4.1$ for i in cat traffic.txt|awk ‘{print $1}‘|sort|uniq ; do cat traffic.txt|grep $i|sort -nr -k3 |head -1 ; done
2012-04-01 21:35 3876.02 mbps
2012-04-02 21:15 3577.66 mbps
2012-04-03 21:35 3371.59 mbps
2012-04-04 21:10 3087.17 mbps
2012-04-05 21:35 3202.44 mbps
2012-04-06 20:45 3703.53 mbps
2012-04-07 20:40 4177.43 mbps
2012-04-08 14:25 3837.9 mbps
2012-04-09 20:50 3082.46 mbps
…
更高效的解決方案:
-bash-4.1$ cat traffic.txt |awk ‘{if($3 > a[$1])a[$1]=$3} END{for(i in a)print i ” ” a[i]}’
2012-04-28 5369.81
2012-04-19 3474.73
2012-04-29 4824.24
2012-04-10 2979.91
2012-04-01 3876.02
2012-04-20 3866.19
2012-04-11 3548.73
2012-04-02 3577.66
2012-04-30 4077.35
…
經對比,後面一種方法處理執行效率仍然高10倍.可見活用awk對文本或日誌分析處理效率明顯提高.
使用Log日誌 計算頻寬流量峰值