三劍客老大——awk企業實戰,面試必備

awk生產環境實戰案例:html


(一):請執行命令取出linux中eth0的IP地址
linux

法1: ifconfig eth0| grep 'inet addr'| awk -F":" '{print $2}'|awk '{print $1}'面試

法2: ifconfig eth0| grep 'inet addr'| cut -d: -f2|cut -d" " -f1正則表達式

法3: ifconfig eth0| grep 'inet addr'| cut -d: -f2| awk '{print $1}'apache

法4: ifconfig eth0| awk -F '[ :]+' 'NR==2 {print $4}' 數組

#法4爲最佳實踐bash

咱們來講明下這個簡單易用的好辦法:服務器

提示:本題NR是行號,分隔符+號匹配,[]裏一個或多個任意一個分隔符,這裏就是匹配一個或多個冒號或空格。jsp

1awk -F 後面跟分隔符,其中[空格:]多分隔符寫法,意思是以空格或冒號作分隔,後面的"+"號是正則表達式,意思是匹配前面空格或冒號,二者之一的1個或1個以上。tcp

2NR==2sed -n "2p",至關,意思都是選擇第幾行,例:

[root@oldboy ~]# ifconfig eth0|awk NR==2
 inet addr:10.0.0.185  Bcast:10.0.0.255  Mask:255.255.255.0


3)指定awk -F '[ :]+'分隔符後,不一樣字符串被分隔的列依次爲:


inet

addr

10.0.0.185

  Bcast:10.0.0.255  Mask:255.255.255.0

第一列

第二列

第三列

第四列

  後面忽略不計。

4)整個答案awk部分意思是,經過NR==2取出第二行,而後,經過-F '[ :]+多分隔符正則匹配,而後經過{print $4}打印出第四列 

5)掌握了理論要去實踐驗證纔是科學嚴謹的學習態度,好,來幾個例子實踐說話吧。

[root@oldboy ~]# echo ---1:----2|awk -F '[-:]+' '{print $2}'     
1
[root@oldboy ~]# echo ---1:----2|awk -F '[-:]+' '{print $3}'     
2
[root@oldboy ~]# echo ---1:::::2|awk -F '[-:]+' '{print $3}'    
2




(二):生產服務器netstat tcp鏈接狀態

法1: netstat -ant|awk '{S[$NF]++}END{for(k in S) print k,S[k]}'

法2: netstat -ant|awk '{S[$6]++}END{for(k in S) print k,S[k]}'

法3: netstat -ant |awk '/^tcp/ {S[$NF]++} END {for(a in S) print a,S[a]}'

法4: netstat -ant |awk '/^tcp/ {S[$6]++} END {for(a in S) print a,S[a]}'

awk庖丁解牛

netstat -n |awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

命令拆分

功能說明

/^tcp/

過濾出以tcp開頭的行,「^」爲正則表達式用法,以...開頭,這裏是過濾出以tcp開頭的行。

S[]

定義了一個名叫S的數組,在awk中,數組下標一般從 1 開始,而不是 0。

NF

當前記錄裏域個數,默認以空格分隔,如上所示的記錄,NF域個數等於6

$NF

表示一行的最後一個域的值,如上所示的記錄,$NF也就是$6,表示第6個字段的值,也就是SYN_RECVTIME_WAIT等。

S[$NF]

表示數組元素的值,如上所示的記錄,就是S[TIME_WAIT]狀態的鏈接數

++S[$NF]

表示把某個數加一,如上所示的記錄,就是把S[TIME_WAIT]狀態的鏈接數加一

END


for(key in S)

遍歷S[]數組

print key,」\t」,S[key]

打印數組的鍵和值,中間用\t製表符分割,顯示好一些。

小例子測試:

[root@ywxi test]# cat test.txt 
001 name wodi 12k
002 name yingsui 15k
003 name jeacen 10k
004 name kuqi 8k
005 name yideng 10k
006 name xiaofan 8k
[root@ywxi test]# awk '{S[$NF]++} END {for(a in S) print a,S[a]}' test.txt     
15k 1
 8k 2
10k 2
12k 1
[root@ywxi test]# awk '{S[$4]++} END {for(a in S) print a,S[a]}' test.txt  
15k 1
 8k 2
10k 2
12k 1
[root@ywxi test]# awk '{print $4}' test.txt |sort |uniq -c |sort -nr
 2 8k
 2 10k
 1 15k
 1 12k




(三):awk數組命令生產實戰拓展

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

[root@ywxi test]# cat access.log 
10.0.0.41 - - [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.42 - - [03/Dec/2010:23:27:01 +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.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 -


3.1 統計apache日誌單ip訪問請求數排名

法1:

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

3 10.0.0.42

2 10.0.0.47

1 10.0.0.41

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

法2:

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

法3:

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

 

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

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

法2: 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




(四):處理如下文件內容,將域名取出並根據域名進行計數排序處理:(百度和sohu面試題)

[root@ywxi test]# cat oldboy.log 
http://www.etiantian.org/index.html
http://www.etiantian.org/1.html
http://post.etiantian.org/index.html
http://mp3.etiantian.org/index.html
http://www.etiantian.org/3.html
http://post.etiantian.org/2.html

處理結果爲:

1 mp3.etiantian.org

2 post.etiantian.org

3 www.etiantian.org

法1: cut -d "/" -f3 test.log |sort |uniq -c    

法2: awk -F "/" '{print $3}' test.log |sort |uniq -c

法3: sed 's#^http://##g' test.log|sed 's#/.*##g'|sort |uniq -c

法4: cat test.log |tr "\/" "\n"|grep etiantian|sort|uniq -c

法5: sed -e 's#^.*//\(.*etiantian.*\)/.*html#\1#g' test.log|sort|uniq -c|sort

法6: cut -d "/" -f 3 test.log |awk '{S[$1]++} END {for(a in S) print S[a],a}'

法7: awk -F "/" '{++S[$3]} END {for(key in S) print S[key],key}' test.log

法8: awk -F '[:/]+' '{print $2}' test.log |sort |uniq -c

相關文章
相關標籤/搜索