一直以來在查對條件是否匹配時,咱們使用的都是簡單的表達式。那若是你想用超過一個表達式來查對特定的條件呢?html
本文,咱們將看看如何在過濾文本和字符串時,結合多個表達式,即複合表達式,用以查對條件。linux
awk 的複合表達式可由表示「與」的組合操做符 &&
和表示「或」的 ||
構成。git
複合表達式的常規寫法以下:github
( 第一個表達式 ) && ( 第二個表達式 )
這裏只有當「第一個表達式」 和「第二個表達式」都是真值時整個表達式才爲真。express
( 第一個表達式 ) || ( 第二個表達式)
這裏只要「第一個表達式」 爲真或「第二個表達式」爲真,整個表達式就爲真。app
注意:切記要加括號。ide
表達式能夠由比較操做符構成,具體可查看 awk 系列的第四節。ui
如今讓咱們經過一個例子來加深理解:code
此例中,有一個文本文件 tecmint_deals.txt
,文本中包含着一張隨機的 Tecmint 交易清單,其中包含了名稱、價格和種類。htm
TecMint Deal List No Name Price Type 1 Mac_OS_X_Cleanup_Suite $9.99 Software 2 Basics_Notebook $14.99 Lifestyle 3 Tactical_Pen $25.99 Lifestyle 4 Scapple $19.00 Unknown 5 Nano_Tool_Pack $11.99 Unknown 6 Ditto_Bluetooth_Altering_Device $33.00 Tech 7 Nano_Prowler_Mini_Drone $36.99 Tech
咱們只想打印出價格超過 $20 且其種類爲 「Tech」 的物品,在其行末用 (*) 打上標記。
咱們將要執行如下命令。
# awk '($3 ~ /^\$[2-9][0-9]*\.[0-9][0-9]$/) && ($4=="Tech") { printf "%s\t%s\n",$0,"*"; } ' tecmint_deals.txt 6 Ditto_Bluetooth_Altering_Device $33.00 Tech * 7 Nano_Prowler_Mini_Drone $36.99 Tech *
此例,在複合表達式中咱們使用了兩個表達式:
($3 ~ /^\$[2-9][0-9]*\.[0-9][0-9]$/)
;查找交易價格超過 $20
的行,即只有當 $3
也就是價格知足 /^\$[2-9][0-9]*\.[0-9][0-9]$/
時值才爲真值。($4 == 「Tech」)
;查找是否有種類爲 「Tech
」的交易,即只有當 $4
等於 「Tech
」 時值才爲真值。&&
操做符的兩端狀態,也就是兩個表達式都是真值的狀況下,這一行纔會被打上 (*)
標誌。有些時候爲了真正符合你的需求,就不得不用到複合表達式。當你掌握了比較和複合表達式操做符的用法以後,複雜的文本或字符串過濾條件也能輕鬆解決。
但願本嚮導對你有所幫助,若是你有任何問題或者補充,能夠在下方發表評論,你的問題將會獲得相應的解釋。
via: http://www.tecmint.com/combine-multiple-expressions-in-awk/
做者:Aaron Kili
譯者:martin2011qi
校對:wxy