awk數組命令經典生產實戰應用拓展

本博文爲老男孩linu培訓機構早期的培訓教案,特分享以供大家學習參考。
全部系列分爲五篇文章,本博文爲第三篇:
四、awk數組命令生產實戰拓展
4.1統計apache日誌單ip訪問請求數排名(這個常用,考試也常考)

假設apache日誌內容access.log內容爲:

10.0.0.41 - - [03/Dec/2010:23:27:01 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -

10.0.0.43 - - [03/Dec/2010:23:27:01 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -

10.0.0.42 - - [03/Dec/2010:23:27:01 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -

10.0.0.46 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -

10.0.0.42 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -

10.0.0.47 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -

10.0.0.41 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -

10.0.0.47 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -

10.0.0.41 - - [03/Dec/2010:23:27:03 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -

10.0.0.46 - - [03/Dec/2010:23:27:03 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -

4.1.1 給出3種解決方案

法一:

[root@oldboy /]# awk '{++S[$1]} END {for (oldboy in S) print oldboy ,S[oldboy]}' access.log |sort -rn -k2

10.0.0.41 3

10.0.0.47 2

10.0.0.46 2

10.0.0.42 2

10.0.0.43 1

#提示 $1爲第一個域的內容。-k2 爲對第二個字段排序,即對數量排序。

2

[root@oldboy /]# awk '{print $1}' access.log|sort|uniq -c |sort -rn -k1

3 10.0.0.41

2 10.0.0.47

2 10.0.0.46

2 10.0.0.42

1 10.0.0.43

提示:這個方法是容易想到的簡單易用的方法,對於大多數同學來說,此法其實更適合大家,awk數組的方法看起來好,實際上對於初級運維來來說有點難度,經常記不住。

3

[root@oldboy /]# sed's/- -.*$//g' access.log|sort|uniq -c|sort -rn -k1

3 10.0.0.41 

2 10.0.0.47 

2 10.0.0.46 

2 10.0.0.42 

1 10.0.0.43 

提示:sed管道後的第一個sort是讓所有一樣的IP挨着,因爲uniq -c只能對相鄰的IP行去重計數。

此題的解答可以有10幾種,前面的課程我們已經帶大家細講了,這裏就不一一講解了。

4.1.2統計apache日誌單ip訪問請求數排名價值何在?

解答:通過前面的命令,我們可以找到什麼IP的訪問apache比較頻繁,一般單個IP訪問數量過百,就值得懷疑了,如果短時間內上萬PV訪問,說明就不正常了,可以採取相應的處理手段,比如封掉此IP,此法要慎重,否則,可能會有誤封問題,因爲,國內的大多數公司還是NAT上網的,出口一個IP

4.2 統計服務器當前單IP連接數最大的IP地址前十

提示:這個命令可以查出遭受DOS***的客戶端IP地址。待處理內容如下:

netstat -n >test.log的結果:

Active Internet connections (w/o servers)

Proto Recv-Q Send-Q Local AddressForeign AddressState

tcp00 124.123.3.79:80219.85.194.23:12004SYN_RECV

tcp00 124.123.3.77:80183.8.74.57:3276SYN_RECV

tcp00 124.123.3.77:80124.236.0.214:63191SYN_RECV

tcp00 124.123.3.77:80121.31.42.148:2338TIME_WAIT

tcp01023 124.123.3.77:8061.178.184.222:62683FIN_WAIT1

tcp00 124.123.3.77:80222.79.242.74:7416TIME_WAIT

tcp04839 124.123.3.77:80121.31.42.148:30638FIN_WAIT1

tcp00 124.123.3.77:80183.10.154.60:37282TIME_WAIT

tcp01 124.123.3.77:8059.49.174.176:26913CLOSING

tcp00 124.123.3.77:80121.31.42.148:1787TIME_WAIT

tcp0174 124.123.3.77:80183.8.74.57:1165CLOSING

4.2.1 問題解決方案

[root@OLDBOY ~]# awk-F '[ :]+' '{++S[$6]} END {for (a in S) print a ,S[a]}' test.log |sort -rn -k2

121.31.42.148 3

183.8.74.57 2

Foreign 1

61.178.184.222 1

59.49.174.176 1

222.79.242.74 1

219.85.194.23 1

183.10.154.60 1

124.236.0.214 1

提示:

1)結果中的字符等,你可以進一步過濾。

2) 對於多分隔符匹配的用法大家可以參考老男孩的博文

深入淺出三劍客之awk必殺技一例

http://oldboy.blog.51cto.com/2561410/950730

3)實際生產中,我們過濾出已經建立連接的狀態ESTABLISHED,然後,應用上述命令處理,完整命令可能爲:

netstat -an|awk-F '[ :]+' '{++S[$6]} END {for (a in S) print a ,S[a]}'|sort -rn -k2

4.2.2 生產環境案例

[leo@LVS-1-1 ~]$ netstat -an|grep EST|awk '{print $5}'|cut -d : -f 1|grep -v "^$"|awk '{++ETT[$1]} END {for (oldboy in ETT) print "ip:"oldboy "-----",ETT[oldboy] ''}'|sort -rn -k2|head -10

ip:220.181.125.69----- 51

ip:121.9.222.164----- 38

ip:121.9.222.158----- 38

ip:121.9.222.156----- 38

ip:121.9.222.161----- 36

ip:121.9.222.160----- 32

ip:121.9.222.159----- 32

ip:121.9.222.162----- 31

ip:61.163.7.200----- 29

ip:115.193.163.61----- 27

提示:這是早期的命令案例,我們看到命令雖然很簡單,但是搞的很複雜。實際上可以用下面看起來簡單,但是難度很大的命令替代之。

netstat -an|grep EST|awk-F '[ :]+' '{++S[$6]} END {for (key in S) print "ip:"key"----->",S[key]}'|sort -rn -k2

注意,這裏過濾的是已經建立連接的的連接,即狀態ESTABLISHED。

4.2.3 本案例解決的生產問題

netstat -an|grep EST|awk-F '[ :]+' '{++S[$6]} END {for (key in S) print "ip:"key"----->",S[key]}'|sort -rn -k2

注意,這裏過濾的是已經建立連接的的連接,即狀態ESTABLISHED。

對於命令結果中,單IP結尾的數大的,可以認爲是不正常的訪問。如 121.31.42.148 100 ,表示一個IP100個連接

一般來說可以懷疑不正常,當網站壓力大時,可以考慮限制或封掉這些冒似非法IP,當然,也不排除,企業裏多個用戶用一個出口IP訪問。

壯士扼腕,有時也是必須的,否則,可能網站整體影響更大,甚至癱瘓。有時,各種搜索引擎的爬蟲是很瘋狂的,通過本例及上面的案例,我們可以再負載IO高時,能夠進行臨時應對,當然,這不是長久的方法,優化網絡和服務器,部署大規模集羣服務器纔是較好的解決之道。

4.2.4 IDC機房帶寬突然暴漲問題經典案例

http://oldboy.blog.51cto.com/2561410/909696


本文未完待續。更多博文內容:
本系列博文完整內容共5篇:

第一篇:詳解linux netstat輸出的網絡連接狀態信息
http://oldboy.blog.51cto.com/2561410/1184139
第二篇:庖丁解牛獲取連接狀態數的awk數組命令
http://oldboy.blog.51cto.com/blog/2561410/1184165
第三篇:awk數組命令經典生產實戰應用拓展
http://oldboy.blog.51cto.com/blog/2561410/1184177
第四篇:老男孩培訓第八節課前awk考試題案例(門戶面試題解答) 
http://oldboy.blog.51cto.com/2561410/1184206
第五篇:linux生產服務器有關網絡狀態的優化措施(告一段落) 
http://oldboy.blog.51cto.com/2561410/1184228

本文出自 “老男孩linux運維” 博客,請務必保留此出處http://oldboy.blog.51cto.com/2561410/1184177


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章