awk 過濾ip地址的理解(根據老男孩老師的blog分析)

awk 過濾ip地址的理解(根據老男孩老師的blog分析)

老男孩老師的博文:http://oldboy.blog.51cto.com/2561410/950730

方法一【此法爲綠葉】:如果用awk來處理的話,一般的同學可能會用下面的辦法實現:

[root@oldboy ~]# ifconfig eth0|grep 'inet addr'|awk -F ":" '{print $2}'|awk '{print $1}'

10.0.0.162

 我的分析:

1、需要寫全inet addr,不然會出現2個。

2、awk -F 是過濾關鍵字段,’:‘ 與: 從結果是來說是一樣的,但是’:‘

比較規範。

[root@lzt-Exam ~]# ifconfig eth0 |grep 'inet addr'|awk -F : '{ print $2}'|awk '{ print $1}'    
192.168.0.81

[root@lzt-Exam ~]# ifconfig eth0 |grep 'inet addr'|awk -F ':' '{ print $2}'|awk '{ print $1}'
192.168.0.81

這樣的結果是:

[root@lzt-Exam ~]# ifconfig eth0 |grep 'inet addr'|awk -F : '{ print $2}' 
192.168.0.81  Bcast   後面吧Bcast過濾掉。後面這個awk '{ print $1 }' 裏面{ } 裏面有個空格。沒有空格會報格式錯誤的。

這裏面有一個隱藏的awk過濾的問題,awk 默認過濾的是空格。後面的awk ‘{ print $1 }’便是很好的說明。

[root@lzt-Exam ~]# ifconfig eth0|grep 'inet addr'|awk -F ':' '{ print $2 }'
192.168.0.81  Bcast

後面在加一個awk ‘{ print $1 }’這樣便把ip給過濾出來。

 

方法二【此法爲小紅花】:通過awk同時使用多個分隔符來實現:

[root@oldboy ~]# ifconfig eth0|grep 'inet addr'|awk -F '[ :]' '{print $13}'

192.168.1.186

提示:本題通過使用空格或冒號來做分隔符,然後一次性取出結果,就是空格或冒號可以看做是同一個分隔符

 這個方法是以空格和:爲過濾的字段進行第一步過濾。

[root@lzt-Exam ~]# ifconfig eth0|grep 'inet addr'    
          inet addr:192.168.0.82  Bcast:192.168.0.255  Mask:255.255.255.0

從頭開始數空格到i那是10個,然後t後是11,addr後面的冒號是12,82後面是13

 

小結:這個方法很方便吧,同學們可以多用,選取包含IP地址行的特殊關鍵字'inet addr’過濾然後,使用awk以空格和:同時做分隔符,然後取出需要的內容。

本答案的最大缺點就是計算$n的時候很費勁,因爲inet前面有多個空格,查到$13,真是不容易,如此看來從實現時間上可能還不如第一個方法快呢?那好引出我們今天的關鍵答案案例。

 

 

 

方法三【大紅花出場】:通過awk同時使用多個分隔符,然後通過正則匹配多個分隔符的方法來實現:

[root@oldboy ~]# ifconfig eth0 |awk -F '[ :]+' 'NR==2 {print $4}'

10.0.0.185

我們來說明下這個簡單易用的好辦法:

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

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

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}打印出第四列 謝謝楊瑞同學的答案啊, 懶得寫了,所以讓你總結下。嘿嘿,看到後別怪老師啊。

 

 [root@lzt-Exam ~]# echo ---0:---1:---2:---3:---4|awk -F '[ :]+' '{ print $0 }'    
---0:---1:---2:---3:---4    全部輸出
[root@lzt-Exam ~]# echo ---0:---1:---2:---3:---4|awk -F '[ :]+' '{ print $1 }'
---0 
[root@lzt-Exam ~]# echo ---0:---1:---2:---3:---4|awk -F '[ :]+' '{ print $2 }'  
---1
[root@lzt-Exam ~]# echo ---0:---1:---2:---3:---4|awk -F '[ :]+' '{ print $3 }'
---2
[root@lzt-Exam ~]# echo ---0:---1:---2:---3:---4|awk -F '[ :]+' '{ print $4 }'
---3
[root@lzt-Exam ~]# echo ---0:---1:---2:---3:---4|awk -F '[ :]+' '{ print $5 }'
---4
[root@lzt-Exam ~]# echo ---0:---1:---2:---3:---4|awk -F '[ :]+' '{ print $6 }'

[root@lzt-Exam ~]#

 

[root@lzt-Exam ~]# echo ---1:----2|awk -F '[-:]+' '{print $2}'
1   $2是第一個參數
[root@lzt-Exam ~]# echo ---1:----2|awk -F '[-:]+' '{print $1}' 
這個$1應該是echo後面的空格
[root@lzt-Exam ~]# echo ---1:----2|awk -F '[-:]+' '{print $0}' 
---1:----2    $0全部輸出
[root@lzt-Exam ~]# echo ---1:----2|awk -F '[-:]+' '{print $3}' 
2     $3 是第二個參數
[root@lzt-Exam ~]#

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