awk數組詳解及企業實戰案例 3.列印數組: [root@nfs-server test]# awk 'BEGIN{array[1]="zhurui";array[2]="zhuzhu";for(key in array) print key,array[key]}' 1 zhurui 2 zhuz ...
awk數組詳解及企業實戰案例
3.列印數組:
[root@nfs-server test]# awk 'BEGIN{array[1]="zhurui";array[2]="zhuzhu";for(key in array) print key,array[key]}'
1 zhurui
2 zhuzhu
[root@nfs-server test]#
[root@nfs-server test]# awk 'BEGIN{array[1]="zhurui";array[2]="zhuzhu";}END {for(key in array) print key,array[key]}'/etc/hosts
1 zhurui
2 zhuzhu
把文件內容第一列作為下標,第二列作為值,放入數組然後輸出。
[root@nfs-server test]# cat t3.log
1 zhurui
2 zhuzhu
[root@nfs-server test]# awk 'BENGIN{S[$1]=$2;}END{for(k in S) print k,S[k]}' t3.log
[root@nfs-server test]# awk '{S[$1]=$2;}END{for(k in S) print k,S[k]}' t3.log
1 zhurui
2 zhuzhu
4、腳本:
#!/bin/awk
BEGIN{
array[1]="zhurui"
array[2]="zhuzhu"
for(key in array)
print key,array[key];
}
[root@nfs-server test]# awk -f t2.awk
1 zhurui
2 zhuzhu
[root@nfs-server test]#
5.把文件內容第一列作為下標k,第二列作為值S[k],放入數組S[]然後輸出。
[root@nfs-server test]# cat t3.log
1 zhurui
2 zhuzhu
[root@nfs-server test]# awk 'BENGIN{S[$1]=$2;}END{for(k in S) print k,S[k]}' t3.log
[root@nfs-server test]# awk '{S[$1]=$2;}END{for(k in S) print k,S[k]}' t3.log
1 zhurui
2 zhuzhu
運用綜上理解,請做考試題:處理以下文件內容,將功能變數名稱取出並根據功能變數名稱進行計數排序處理:(百度和SOHU面試題)
test.log
http://www.judong.org/index.html
http://www.judong.org/1.html
http://post.judong.org/index.html
http://mp3.judong.org/index.html
http://www.judong.org/3.html
http://post.judong.org/2.html
[root@nfs-server test]# awk -F "/"'{S[$3]=S[$3]+1;}END{for(k in S) print k,S[k]}' test.log
mp3.judong.org 1
post.judong.org 2
www.judong.org 3
最終答案:
[root@nfs-server test]# awk -F "/"'{S[$3]++}END{for(k in S) print k,S[k]}' test.log|sort -rn -k2|head
www.judong.org 3
post.judong.org 2
mp3.judong.org 1
[root@nfs-server test]#
例3:統計Web日誌單IP訪問排名(這個工作中常用,面試也常用)
對於統計訪問連接IP個數的答案為:
[root@nfs-server test]# awk -F " "'{S[$1]=S[$1]+1;}END{for (k in S) print k,S[k]}' access-test.log|sort -rn|head ##此方法較複雜
10.0.0.3775
10.0.0.1322
10.0.0.1245
10.0.0.1202
10.0.0.1082
10.0.0.1001
[root@nfs-server test]# awk -F " "'{S[$1]++;}END{for (k in S) print k,S[k]}' access-test.log|sort -rn|head ##上一步的簡化版
10.0.0.3775
10.0.0.1322
10.0.0.1245
10.0.0.1202
10.0.0.1082
10.0.0.1001
[root@nfs-server test]# awk -F " "'{Z[$1]++;}END{for (k in Z) print k,Z[k]}' access-test.log|sort -rn|head
10.0.0.3775
10.0.0.1322
10.0.0.1245
10.0.0.1202
10.0.0.1082
10.0.0.1001
方法1:
方法2:
例4:統計企業工作中高併發linux伺服器不同網路連接狀態對應的數量
方法1:
[root@nfs-server test]# awk '/^tcp/ {S[$NF]++}END{for(k in S) print S[k],k}' netstat.log|sort -rn|head
105 TIME_WAIT
101 ESTABLISHED
55 FIN_WAIT2
7 FIN_WAIT1
5 SYN_RECV
5 LISTEN
3 LAST_ACK
1 CLOSING
[root@nfs-server test]#
方法2:
[root@nfs-server test]# awk '/^tcp/ {print $NF}' netstat.log|sort|uniq -c|sort -rn|head
105 TIME_WAIT
101 ESTABLISHED
55 FIN_WAIT2
7 FIN_WAIT1
5 SYN_RECV
5 LISTEN
3 LAST_ACK
1 CLOSING
[root@nfs-server test]#
例5:
分析圖片服務日誌,把日誌(每個圖片訪問次數*圖片大小的總和)排行,取top10,也就是計算每個url的總訪問大小
說明:範例7的生產環境應用:這個功能可以用於IDC及CDN網站流量帶寬很高,然後通過分析伺服器日誌哪些元素占用流量過大,進而進行優化裁剪該圖片(見老男孩發佈的《淘寶的雙十一超大流量應對文章點評》),壓縮js等措施。
本題需要輸出三個指標: 【訪問次數】 【訪問次數*單個文件大小】 【文件名(可以帶URL)】
解答:
測試數據
59.33.26.105 - - [08/Dec/2010:15:43:56 +0800] "GET /static/images/photos/2.jpg HTTP/1.1" 200 11299"http://oldboy.blog.51cto.com/static/web/column/17/index.shtml?courseId=43" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"
59.33.26.105 - - [08/Dec/2010:15:43:56 +0800] "GET /static/images/photos/2.jpg HTTP/1.1" 200 11299"http://oldboy.blog.51cto.com/static/web/column/17/index.shtml?courseId=43" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"
59.33.26.105 - - [08/Dec/2010:15:44:02 +0800] "GET /static/flex/vedioLoading.swf HTTP/1.1" 200 3583"http://oldboy.blog.51cto.com/static/flex/AdobeVideoPlayer.swf?width=590&height=328&url=/[[DYNAMIC]]/2" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"
124.115.4.18 - - [08/Dec/2010:15:44:15 +0800] "GET /?= HTTP/1.1" 200 46232 "-" "-"
124.115.4.18 - - [08/Dec/2010:15:44:25 +0800] "GET /static/js/web_js.js HTTP/1.1" 200 4460 "-" "-"
124.115.4.18 - - [08/Dec/2010:15:44:25 +0800] "GET /static/js/jquery.lazyload.js HTTP/1.1" 200 1627 "-" "-"
法一:通過兩個數組來計算
因為我們要的最終結果是某個文件的訪問次數和消耗的流量,所以考慮建立以文件名為索引的兩個數組,一個存儲訪問次數,一個保存消耗的流量,這樣當使用awk按行遍歷文件時,對次數數組+1,同時對流量數組進行文件大小的累加,等文件掃描完成,再遍歷輸出兩個數組既可以得到該文件的反問次數和總的流量消耗。
[root@locatest scripts]# awk '{array_num[$7]++;array_size[$7]+=$10}END{for(x in array_num){print array_size[x],array_num[x],x}}' access_2010-12-8.log |sort -rn -k1|head -10 >1.log
法二:
[root@locatest scripts]# awk '{print $7"\t" $10}' access_2010-12-8.log|awk '{S[$1]+=$2;S1[$1]+=1}END{for(i in S) print S[i],S1[i],i}'|sort -rn|head -10 >2.log
[root@locatest scripts]# diff 1.log 2.log
[root@locatest scripts]# cat 1.log
57254 1 /static/js/jquery-jquery-1.3.2.min.js
46232 1 /?=
44286 1 //back/upload/course/2010-10-25-23-48-59-048-18.jpg
33897 3 /static/images/photos/2.jpg
11809 1 /back/upload/teacher/2010-08-30-13-57-43-06210.jpg
10850 1 /back/upload/teacher/2010-08-06-11-39-59-0469.jpg
6417 1 /static/js/addToCart.js
4460 1 /static/js/web_js.js
3583 2 /static/flex/vedioLoading.swf
2686 1 /static/js/default.js