awk 19html
通常來講流量帶寬是經過snmp協議取網卡流量畫圖。不過有的時候,爲了優化分析或者排錯,也會直接去計算服務的訪問流量。方法很簡單,根據日誌中記錄的 請求時間(squid記錄的是請求響應完成時間,若是要精確,能夠再減去響應時間,不過通常squid的文件不至於5分鐘內還傳不完的……),按每5分鐘 一彙總其字節數,而後均攤到300秒上。linux
計算全日誌中最高帶寬的命令行以下:nginx
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 模塊,應該不難)shell
案例:使用awk與sort -nr分析訪問日誌,找出每種請求返回狀態碼的請求個數:apache
訪問日誌的文件格式:bash
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 ,但其實,這個處理的效率較低:ui
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倍~
有一個文本文件,內容爲每行爲每隔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對文本或日誌分析處理效率明顯提升.