awk模式(Pattern)之一

2022-06-06 18:03:07 字數 2953 閱讀 7558

對於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@server01 ~]# cat test2

abc

123iuy ddd

8ua

456auv ppp 7y7

123666

[root@server01 ~]# awk '

nf==5

'test2

8ua

456 auv ppp 7y7

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

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

[root@server01 ~]# awk '

nf>2

'test2

abc

123iuy ddd

8ua

456 auv ppp 7y7

[root@server01 ~]# awk '

nf<=4

'test2

abc

123iuy ddd

123666

[root@server01 ~]# awk '

$1=123

'test2

123123

iuy ddd

123456

auv ppp 7y7

123666

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

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

關係運算子

含義用法示例

小於x < y

小於等於

x <= y

等於x == y

不等於x != y

大於等於

x >= y

大於x > y

與對應的正則匹配則為真

x ~ /正則/

與對應的正則不匹配則為真

x !~ /正則/

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

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

[root@server01 ~]# awk '

nf==5

'test2

8ua

456auv ppp 7y7

[root@server01 ~]# awk '

'test2

abc

123iuy ddd

8ua

456auv ppp 7y7

123666

這種"模式"是"關係表示式模式",如果當前行的字段數量等於5,模式被匹配,對應的行被列印。

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

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

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

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

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

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

[root@server01 ~]# awk '

beginend

'test2

aaa bbb

abc

1238ua

456123

666ccc ddd

三類"模式"

1、空模式

2、關係運算模式

3、begin/end模式

Pattern 筆記 組合模式

也被稱為整體 部分模式,不管是整體還是部分,最終都是通過乙個方法來操作 部分 整體場景,樹形選單,檔案 資料夾的管理 linux 系統目錄,頂層抽象 author zyred createtime 2020 9 9 14 03 public abstract class directory 方法抽象...

設計模式之一(Iterator模式)

表 1 1 類和介面的一覽表 名字說明 aggregate 表示集合的介面 iterator 遍歷集合的介面 book 表示書的類 bookshelf 表示書架的類 bookshelfiterator 遍歷書架的類 main 測試程式行為的類 aggregate介面 public inte ce a...

Linux三劍客之一 awk

awk 是一種優良的文字處理工具,linux及unix環境中現有的功能最強大的資料處理引擎之一。這種程式設計及資料操作語言的最大功能取決於乙個人所擁有的知識。awk命名 alfred aho peter weinberger和brian kernighan三個人的姓的縮寫。最簡單地說,awk 是一種...