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

緣起:上完第三節培訓課後,同窗們羣內討論氛圍至關的好,那麼就再給你們一點驚喜,但願你們繼續加油努力,達到大家的第一階段薪水目標。
linux

老男孩linux培訓第三節課程課前第考試三題,問題以下:正則表達式

3.請執行命令取出linuxeth0IP地址(請用cut,有能力者也可分別用awk,sed命令答)架構

解答:運維

說明:此題解答方法已經給你們講解了不下15種,還能夠有不少,在這裏給你們着重講下awk的技巧用法,但願你們能多重視老師的思路、思惟過程,不過過度關注問題的答案,以便達到學一通十的效果。ide

方法一【此法爲綠葉】:若是用awk來處理的話,通常的同窗可能會用下面的辦法實現:學習

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

10.0.0.162orm

小結:這個方法是常規方法,很好。可是咱們有沒有更簡單的awk實現方法呢?往下看。xml

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

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

192.168.1.186

提示:本題經過使用空格或冒號來作分隔符,而後一次性取出結果,就是空格或冒號能夠看作是同一個分隔符。

小結:這個方法很方便吧,同窗們能夠多用,選取包含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}打印出第四列 !謝謝楊瑞同窗的答案啊, 懶得寫了,因此讓你總結下。嘿嘿,看到後別怪老師啊。

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

最後把個人這些年的運維感悟送給你們:

老男孩語錄⑧⑧-把簡單的技術學到極致就是高手

工做中多用簡單的技術,實現較複雜的架構,這樣不但能減小維護成本,還減小出故障問題的概率,

同時下降修復故障所花費的時間,更避免流失處理的人無人接替維護的尷尬局面發生。

運維工做中:簡單、易用,是使用命令,選擇軟件和解決方案的基本原則,不是越複雜越好。

相關文章
相關標籤/搜索