我們之前一直在提,awk的使用語法如下:
awk [options] 'Pattern {Action} file1 file2 ...'
- 對于options(選項)而言厨姚,我們使用過-F選項衅澈,也使用過-v選項;
- 對于Action(動作)而言遣蚀,我們使用過print和printf矾麻。
- 對于Pattern(模式)而言纱耻,我們開始學(xué)習(xí)awk的時候,就知道了兩種特殊模式险耀,BEGIN模式和END模式弄喘,接下來甩牺,我們將詳細(xì)的介紹一下awk的模式蘑志。
“模式”不好理解。但是將“模式”換成“條件”贬派,可能更容易理解急但,那么“條件”是什么意思呢?awk是逐行處理文本的搞乏,也就是說波桩,awk會先處理完當(dāng)前行,再處理下一行请敦,如果我們不指定任何“條件”镐躲,awk會一行一行的處理文本的每一行,如果指定了“條件”侍筛,只有滿足“條件”的行才會被處理萤皂,不滿足“條件”的行就不會被處理。
如下圖所示匣椰,test2文件中有3行文本裆熙,第一行有4列,第二行有5列禽笑,第三行只有2列入录,而下圖的awk命令中,就使用到了一個簡單的模式佳镜。
上圖中纷跛,當(dāng)處理的行正好有5列字段(NF==5)時,那么被處理的行滿足“條件”邀杏,滿足條件的行就會執(zhí)行相應(yīng)的動作,而動作就是${print $0}唬血,即打印當(dāng)前行望蜡。
上圖中使用的Pattern(模式)中,都使用了關(guān)系表達(dá)式(關(guān)系操作符)拷恨,當(dāng)經(jīng)過關(guān)系運算得出的結(jié)果為“真”時脖律,則滿足條件(表示與指定的模式匹配),滿足條件腕侄,就會執(zhí)行相應(yīng)的動作小泉。
awk支持的運算符
關(guān)系運算符 | 含義 | 用法示例 |
---|---|---|
< | 小于 | x<y |
<= | 小于等于 | x<=y |
== | 等于 | x==y |
!= | 不等于 | x!=y |
>= | 大于等于 | x>=y |
> | 大于 | x>y |
~ | 與對應(yīng)的正則匹配則為真 | x~/正則/ |
!~ | 與對應(yīng)的正則不匹配則為真 | x!~/正則/ |
我們把這種用到“關(guān)系運算符”的“模式”稱為:“關(guān)系表達(dá)式模式”或者“關(guān)系運算符模式”芦疏。
1. 空模式和關(guān)系表達(dá)式模式
上圖中命令1指定了“模式”,這種“模式”是“關(guān)系表達(dá)式模式”微姊,如果當(dāng)前行的字段數(shù)量等于5酸茴,模式則匹配,對應(yīng)的行被打印兢交。
上圖中命令2貌似沒有使用任何“模式”薪捍,所以,每一行都執(zhí)行了指定的動作配喳,即每一行都被輸出了酪穿,其實,這種沒有指定任何模式的情況晴裹,也是一種模式被济。我們稱這種情況為“空模式”〗牛“空模式”會匹配文本中的每一行只磷,所以,每一行都滿足“條件”少欺,每一行都執(zhí)行相應(yīng)的動作喳瓣。
2. BEGIN模式和END模式
- BEGIN模式指定了處理文本之前所需要執(zhí)行的操作;
- END模式指定了處理完所有行之后所需要執(zhí)行的操作赞别;
3. 正則模式
上面說到畏陕,模式可以理解為條件》绿希【空模式】當(dāng)不指定模式時惠毁,文本中的每一行都會執(zhí)行對應(yīng)的動作;當(dāng)指定模式時崎页,符合條件的行才會執(zhí)行對應(yīng)的動作鞠绰。
什么叫做正則模式,正則模式可以理解為:把正則表達(dá)式當(dāng)做條件飒焦,能與正則匹配的行蜈膨,就算滿足條件,滿足條件的行才會執(zhí)行對應(yīng)的動作牺荠,不能被正則匹配的行翁巍,則不會執(zhí)行對應(yīng)的動作。
例子:我們知道休雌,在Linux中灶壶,/etc/passwd文件中存放了用戶信息,那么假設(shè)杈曲,我們想要從/etc/passwd文件中找出用戶名以zsy開頭的用戶驰凛,我們該如何操作胸懈?
如何使用awk命令,完成上述的需求恰响?
可以看出趣钱,不管是使用grep命令還是使用awk命令,都使用了相同的正則表達(dá)式^zsy渔隶。唯一的區(qū)別就是羔挡,在grep命令中,直接使用了正則表達(dá)式间唉。而在awk命令中绞灼,正則表達(dá)式被放在了兩個斜線中。
上例中呈野,grep和awk的命令實現(xiàn)的效果是一樣的低矮,而且grep更加簡單一些,那為什么還要使用awk命令呢被冒?
awk有著自己的優(yōu)勢军掂,那就是格式化能力。換一個場景:
- 從/etc/passwd文件中找出符合條件的行昨悼;
- 找出符合條件的文本行后蝗锥,以:為分隔符,將文本分段率触;
- 取出我們需要的字段终议,格式化輸出;
- 結(jié)合BEGIN模式葱蝗。輸出一個格式化以后的文本穴张,提高可讀性;
正則模式的注意點
- 需要注意:使用正則模式時两曼,如果正則中包含"/"皂甘,則需要進(jìn)行轉(zhuǎn)義。
- 需要注意:當(dāng)使用{x,y}這種次數(shù)匹配的正則表達(dá)式的時候悼凑,需要配合--posix選項或者--re-interval選項偿枕。
4. 行范圍模式
行范圍模式條件就是滿足兩行之間的數(shù)據(jù)。
在介紹行范圍模式之前户辫,先來思考一個問題益老。有一個文本文件,文件內(nèi)容如下:
如上圖所示寸莫,Green出現(xiàn)了2次,Kenvin也出現(xiàn)了2次档冬。假設(shè)我想從上述文本中找出膘茎,從Green第一次出現(xiàn)桃纯,到Kenvin第一次出現(xiàn)之間的所有行,該怎么辦披坏?
我們可以把行范圍模式和正則模式的語法進(jìn)行對比:
- 上圖中第一種語法是正則模式的語法态坦,表示被正則表達(dá)式匹配的行,將執(zhí)行對應(yīng)的動作棒拂。
- 上圖中第二種語法是行范圍模式的語法伞梯,表示被正則1匹配到的行開始,到正則2匹配到的行結(jié)束帚屉,之間的行所有行都會執(zhí)行對應(yīng)的動作谜诫。所以這種模式稱為行范圍模式,因為他對應(yīng)一個范圍以內(nèi)的所有行攻旦。但需要注意的是喻旷,在行范圍模式中,不管是正則1牢屋,還是正則2且预,都以第一次匹配到的行為準(zhǔn)。
但是可能存在這樣的需求烙无,不想依靠正則表達(dá)式去匹配行的特征锋谐,只是想單純的打印從X行到Y(jié)行之間的所有行。
在之前學(xué)習(xí)到的關(guān)系運算符模式截酷,可滿足我們的需求:
5. 關(guān)系表達(dá)式模式+正則模式
在學(xué)習(xí)"關(guān)系表達(dá)式模式"時涮拗,有一個"關(guān)系運算符"需要和"正則模式"配合使用,它就是"~"合搅。
關(guān)系運算符 | 含義 | 用法示例 |
---|---|---|
~ | 與對應(yīng)的正則匹配則為真 | x~/正則/ |
!~ | 與對應(yīng)的正則不匹配則為真 | x!~/正則/ |
關(guān)系運算符""和關(guān)系運算符"!"都需要配合"正則模式"使用多搀。
例如:我想從如下文本中找出,網(wǎng)卡1的IP地址在192.168.0.0網(wǎng)段的主機灾部,該怎么辦康铭?
可以使用如下面命令,利用關(guān)系運算符與正則模式赌髓,達(dá)到我們的目的从藤;