1. 程式人生 > 實用技巧 >五,awk模式(Pattern)之一

五,awk模式(Pattern)之一

  我們之前一直在提,awk的使用語法如下(我想你已經很熟悉了):

  awk [options] 'Pattern {Action}' file1 file2 ···

  對於options(選項)而言,我們使用過-F選項,也使用過-v選項。

  對於Action(動作)而言,我們使用過print與printf,之後的文章中,我們還會對Action進行總結。

  對於Pattern(模式)而言,我們在剛開始學習awk時,就介紹了兩種特殊模式,BEGIN模式和END模式,但是,我們並沒有詳細的介紹"模式"是什麼,怎麼用,而此處,我們將詳細的介紹一下awk中的模式。

  "模式"這個詞聽上去文縐縐的,不是特別容易理解,那麼我們換一種說法,我們把"模式"換成"條件",可能更容易理解,那麼"條件"是什麼意思呢?我們知道,awk是逐行處理文字的,也就是說,awk會先處理完當前行,再處理下一行,如果我們不指定任何"條件",awk會一行一行的處理文字中的每一行,如果我們指定了"條件",只有滿足"條件"的行才會被處理,不滿足"條件"的行就不會被處理。這樣說是不是比剛才好理解一點了呢?這其實就是awk中的"模式"。

  再囉嗦一遍,當awk進行逐行處理的時候,會把pattern(模式)作為條件,判斷將要被處理的行是否滿足條件,是否能跟"模式"進行匹配,如果匹配,則處理,如果不匹配,則不進行處理。

  看個小例子,就能秒懂,前提是建立在之前知識的基礎之上。

  如下圖所示,test2檔案中有3行文字,第一行有4列,第二行有5列,第三行只有2列。而下圖的awk命令中,就使用到了一個簡單的模式。

[root@node1 ~]# awk 'NF==5 {print $0}' test2
8ua 456 auv ppp 7y7
[root@node1 ~]# cat test2
abc 123 iuy ddd
8ua 456 auv ppp 7y7
123 456

  上圖中,我們使用了一個簡單的"模式",換句話說,我們使用了一個簡單的"條件",這個條件就是,如果被處理的行正好有5列欄位,那麼被處理的行則滿足"條件",滿足條件的行會執行相應的動作,而動作就是{print $0},即列印當前行,換句話說,就是隻列印滿足條件的行,條件就是這一行文字有5列(NF是內建變數,表示當前行的欄位數量,如果你忘了,那麼請你重新看一遍之前的文章),而上例中,只有第二行有5列,所以,只有第二行能與我們指定的"模式"相匹配,最終也就只輸出了第二行。

  這就是所謂的"模式",其實很簡單,對吧。聰明如你,應該已經能夠舉一反三了,舉例如下。

[root@node1 ~]# awk 'NF>2 {print $0}' test2
abc 123 iuy ddd
8ua 456 auv ppp 7y7
[root@node1 ~]# awk 'NF<=4 {print $0}' test2
abc 123 iuy ddd
123 456
[root@node1 ~]# awk '$1==123 {print $0}' test2
123 456

  沒錯,"模式"怎樣寫,取決於我們想要給出什麼樣的限制條件。

  細心如你一定發現了,上圖中使用的"模式"都有一個共同點,就是上述"模式"中,都使用到了關係表示式(關係操作符),比如 ==,比如<=,比如>,當經過關係運算得出的結果為"真"時,則滿足條件(表示與指定的模式匹配),滿足條件,就會執行相應的動作,而上例中使用到的運算子都是常見的關係運算符,我們就不解釋了,那麼awk都支援哪些關係運算符呢?我們來總結一下。

  我們把這種用到了"關係運算符"的"模式"稱之為:"關係表示式模式"或者"關係運算符模式"。

  其實,在學習"模式"之前,我們一直都在使用"模式",只是我們沒有感覺到而已,為什麼這麼說呢?聽完下面的解釋,你就會明白。

  上圖中的命令1指定了"模式",而且這種"模式"是"關係表示式模式",如果當前行的欄位數量等於5,模式被匹配,對應的行被列印。

  上圖中的命令2貌似沒有使用任何"模式",所以,每一行都執行了指定的動作,即每一行都被輸出了,其實,這種沒有被指定任何"模式"的情況,也是一種"模式",我們稱這種情況為"空模式","空模式"會匹配文字中的每一行,所以,每一行都滿足"條件",所以,每一行都會執行相應的動作。

  

  現在,我們不僅懂得了什麼是awk的"模式(Pattern)",而且還掌握了兩種"模式",空模式和關係運算模式。

  不對,我們似乎遺忘了什麼 ,我們還用過BEGIN模式和END模式,我們來回顧一下吧。

  BEGIN模式,表示在開始處理文字之前,需要執行的操作。

  END模式,表示將所有行都處理完畢後,需要執行的操作。

  還記得我們在第一篇awk博文中使用到的例子嗎,溫故知新,回過頭看,會有新發現

  上圖中的示例用到了BEGIN模式,空模式,END模式。

  其實,"模式"還有其他的"樣子",只是我們今天還沒有見識到而已,不過,今天的時光也沒有白費,起碼我們知道了"模式"的概念,以及如下三類"模式"

  1、空模式

  2、關係運算模式

  3、BEGIN/END模式