2. 精確匹配
假定要使字符串精確匹配,比如說查看學生序號4 8,文件中有許多學生序號包含4 8,如果在f i e l d - 3中查詢序號4 8,a w k將返回所有序號帶4 8的記錄:
CODE:
[root@Linux_chenwy sam]# awk '{if($3~/48/) print$0}' grade.txt
M.Tans 5/99 48311 Green 8 40 44
J.Lulu 06/99 48317 green 9 24 26
P.Bunny 02/99 48 Yellow 12 35 28
J.Troll 07/99 4842 Brown-3 12 26 26
爲精確匹配4 8,使用等號= =,並用單引號括起條件。例如$ 3
CODE:
[root@Linux_chenwy sam]# awk '$3=="48" {print$0}' grade.txt
P.Bunny 02/99 48 Yellow 12 35 28
[root@Linux_chenwy sam]# awk '{if($3=="48") print$0}' grade.txt
P.Bunny 02/99 48 Yellow 12 35 28
3. 不匹配
有時要瀏覽信息並抽取不匹配操作的記錄,與~相反的符號是!~,意即不匹配。像原來使用查詢b r o w n腰帶級別的匹配操作一樣,現在看看不匹配情況。表達式$0 !~/brown/,意即查詢不包含模式b r o w n腰帶級別的記錄並打印它。
注意,缺省情況下, a w k將打印所有匹配記錄,因此這裏不必加入動作部分。
CODE:
[root@Linux_chenwy sam]# awk '$0 !~ /Brown/' grade.txt
M.Tans 5/99 48311 Green 8 40 44
J.Lulu 06/99 48317 green 9 24 26
P.Bunny 02/99 48 Yellow 12 35 28
可以只對f i e l d - 4進行不匹配操作,方法如下:
CODE:
[root@Linux_chenwy sam]# awk '{if($4~/Brown/) print $0}' grade.txt
J.Troll 07/99 4842 Brown-3 12 26 26
L.Tansl 05/99 4712 Brown-2 12 30 28
如果只使用命令awk$4 !="brown"{print $0} grade.txt,將返回錯誤結果,因爲用引號括起了b r o w n,將只匹配‘b r o w n而不匹配b r o w n - 2和b r o w n - 3,當然,如果想要查詢非b r o w n - 2的腰帶級別,可做如下操作:
CODE:
[root@Linux_chenwy sam]# awk '$4!="Brown-2" {print $0}' grade.txt
M.Tans 5/99 48311 Green 8 40 44
J.Lulu 06/99 48317 green 9 24 26
P.Bunny 02/99 48 Yellow 12 35 28
J.Troll 07/99 4842 Brown-3 12 26 26
4. 小於
看看哪些學生可以獲得升段機會。測試這一點即判斷目前級別分f i e l d - 6是否小於最高分f i e l d - 7,在輸出結果中,加入這一改動很容易。
CODE:
[root@Linux_chenwy sam]# awk '{if($6 < $7) print $0}' grade.txt
M.Tans 5/99 48311 Green 8 40 44
J.Lulu 06/99 48317 green 9 24 26
5. 小於等於
對比小於,小於等於只在操作符上做些小改動,滿足此條件的記錄也包括上面例子中的輸出情況。
CODE:
[root@Linux_chenwy sam]# awk '{if($6 <= $7) print $1}' grade.txt
M.Tans
J.Lulu
J.Troll
6. 大於
CODE:
[root@Linux_chenwy sam]# awk '{if($6 > $7) print $1}' grade.txt
P.Bunny
L.Tansl
7. 設置大小寫
爲查詢大小寫信息,可使用[ ]符號。在測試正則表達式時提到可匹配[ ]內任意字符或單詞,因此若查詢文件中級別爲g r e e n的所有記錄,不論其大小寫,表達式應爲‘ / [ G g ] r e e n /’
CODE:
[root@Linux_chenwy sam]# awk '/[Gg]reen/' grade.txt
M.Tans 5/99 48311 Green 8 40 44
J.Lulu 06/99 48317 green 9 24 26
8. 任意字符
抽取名字,其記錄第一域的第四個字符是a,使用句點.。表達式/ ^ . . . a /意爲行首前三個字符任意,第四個是a,尖角符號代表行首。
CODE:
[root@Linux_chenwy sam]# awk '$1 ~ /^...a/' grade.txt
M.Tans 5/99 48311 Green 8 40 44
L.Tansl 05/99 4712 Brown-2 12 30 28
9. 或關係匹配
爲抽取級別爲y e l l o w或b r o w n的記錄,使用豎線符|。意爲匹配| 兩邊模式之一。注意,使用豎線符時,語句必須用圓括號括起來。
CODE:
[root@Linux_chenwy sam]# awk '$0 ~/(Yellow|Brown)/' grade.txt
P.Bunny 02/99 48 Yellow 12 35 28
J.Troll 07/99 4842 Brown-3 12 26 26
L.Tansl 05/99 4712 Brown-2 12 30 28
上面例子輸出所有級別爲Ye l l o w或B r o w n的記錄。
使用這種方法在查詢級別爲G r e e n或g r e e n時,可以得到與使用[ ]表達式相同的結果。
CODE:
[root@Linux_chenwy sam]# awk '/^M/' grade.txt
M.Tans 5/99 48311 Green 8 40 44
10. 行首
不必總是使用域號。如果查詢文本文件行首包含M的代碼,可簡單使用下面^符號:
CODE:
[root@Linux_chenwy sam]# awk '/^M/' grade.txt
複合表達式即爲模式間通過使用下述各表達式互相結合起來的表達式:
QUOTE:
&& AND : 語句兩邊必須同時匹配爲真。
|| O R:語句兩邊同時或其中一邊匹配爲真。
! 非求逆
11. AND
打印記錄,使其名字爲‘ P. B u n n y且級別爲Ye l l o w,使用表達式( $ 1 = = " P. B u n n y " & &$ 4 = = " Ye l l o w " ),意爲& &兩邊匹配均爲真。完整命令如下:
CODE:
[root@Linux_chenwy sam]# awk '{if ($1=="P.Bunny" && $4=="Yellow") print $0}' grade.txt
P.Bunny 02/99 48 Yellow 12 35 28
12. Or
如果查詢級別爲Ye l l o w或B r o w n,使用或命令。意爲“ | |”符號兩邊的匹配模式之一或全部爲真。
CODE:
[root@Linux_chenwy sam]# awk '{if ($4=="Yellow" || $4~/Brown/) print $0}' grade.txt
P.Bunny 02/99 48 Yellow 12 35 28
J.Troll 07/99 4842 Brown-3 12 26 26
L.Tansl 05/99 4712 Brown-2 12 30 28
原來不一定得加print,下面我自己對例一二做了一下
CODE:
1
[root@Linux_chenwy sam]# awk '$4~/Brown/' grade.txt
J.Troll 07/99 4842 Brown-3 12 26 26
L.Tansl 05/99 4712 Brown-2 12 30 28
CODE:
2
[root@Linux_chenwy sam]# awk '$3=="48"' grade.txt
P.Bunny 02/99 48 Yellow 12 35 28
CODE:
[root@Linux_chenwy sam]# awk '$3="48"' grade.txt
M.Tans 5/99 48 Green 8 40 44
J.Lulu 06/99 48 green 9 24 26
P.Bunny 02/99 48 Yellow 12 35 28
J.Troll 07/99 48 Brown-3 12 26 26
L.Tansl 05/99 48 Brown-2 12 30 28
2中,我把=和==寫錯了,呵呵,一個是賦值,一個是等於