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
1)awk -F 後面跟分隔符,其中[空格:]多分隔符寫法,意思是以空格或冒號作分隔,後面的"+"號是正則表達式,意思是匹配前面空格或冒號,二者之一的1個或1個以上。tcp
2)NR==2和sed -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 '[ :]+'分隔符後,不一樣字符串被分隔的列依次爲:
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]}'
小例子測試:
[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