關系操作符和布爾操作符用於在兩個表達式之間進行比較。下表列出了關系操作符。
關系操作符
關系表達式可用在模式中來控制特殊的操作。例如,如果我們想限定要處理的記錄包含5個字段,則可以用下面的表達式:
NF == 5這個關系表達式將NF(每個輸入記錄的字段數)的值和5相比較。如果結果為真,那麼就進行相應的處理,否則不進行處理。
注意: 關系操作符"== (相等)"和賦值操作符"= (等於)"是不同的。用"="代替"=="來檢測相等性是一個經常犯的錯誤。
我們可以在試圖打印數據庫phonelist的記錄之前用一個關系表達式來檢測。
NF==6 { print $1,$6 }只有具有6個字段的記錄才能被打印。
和"--"相反的是"! = (不相等的)"。同樣地,可以比較一個表達式是否大於(>)或小於(<),或大於等於(>=),或小於等於(<=)另一個表達式。如下的表達式:
NR > 1檢測當前記錄號是否大於1,在條件表達式的一章,我們看到,關系表達式經常用在if語句中,通過計算來決定是否執行特殊的操作。
正則表達式經常用斜槓包圍。這經常被作為正則表達式常量,正如"Hello"是一個字符串常量一樣。我們已經看到很多這樣例子:
/^$/ { print "This is a blank line." }然而,也常常不局限於正則表達式常量。當使用關系操作符~(匹配)或! ~ (不匹配)時,右邊的表達式可以是awk中的任意表達式; awk將它作為一個字符串並用來指定一個正則表達式。
$5 ~ /MA/ { print $1 ", "$6 }這個語句是將第五個字段的值與正則表達式"MA"比較。
因為所有的表達式都與~口!~一起使用,因此正則表達式可以用變量來提供。例如,在腳本phonelist中,我們可以用state 來代替"/MA/" ,並編寫一個過程來定義state的值。
$5 ~ state { print $1 ", "$6}這使得程序代碼更加通用,因為在腳本執行過程中可以動態改變模式。例如,我們可以從命令行參數得到state的值,在之後的文章中我們將討論如何將命令行參數傳遞給腳本。