1 第4.1節:使用正則表達式
??將正則表達式用斜杠括起來,就能用作模式。隨后,該正則表達式會與每條輸入記錄的完整文本進行比對。(通常情況下,它只需匹配文本的部分內容就能視作匹配成功。)例如,以下代碼會打印出mail-list
文件中,任意位置出現字符串li
的記錄的第二個字段:
$ awk '/li/ { print $2 }' mail-list
執行結果:
555-5553
555-0542
555-6699
555-3430
??正則表達式也能用于匹配表達式中。這些表達式允許你指定要匹配的字符串,該字符串不必是當前輸入記錄的全部內容。~
和!~
這兩個操作符用于執行正則表達式的比較操作。使用這些操作符的表達式,既可以用作模式,也能在if
、while
、for
和do
語句中使用(詳見第7.4節 “動作中的控制語句”)。例如,對于以下表達式,如果exp
(作為字符串看待)與regexp
匹配,則表達式的值為真:
exp ~ /regexp/
??下面的示例會匹配(篩選出)所有第一個字段中含有大寫字母J
的輸入記錄:
$ awk '$1 ~ /J/' inventory-shipped
執行結果:
Jan 13 25 15 115
Jun 31 42 75 492
Jul 24 34 67 436
Jan 21 36 64 620
下面這段代碼也能實現相同的功能:
awk '{ if ($1 ~ /J/) print }' inventory-shipped
再看下面這個例子,如果exp
(作為字符串看待)與regexp
不匹配,那么表達式的值為真:
exp !~ /regexp/
下面的示例會匹配(篩選出)所有第一個字段中不包含大寫字母J
的輸入記錄:
$ awk '$1 !~ /J/' inventory-shipped
執行結果:
Feb 15 32 24 226
Mar 15 24 34 228
Apr 31 52 63 420
May 16 34 29 208
當一個正則表達式被包含在斜杠中,如/foo/
,我們稱其為正則表達式常量,這與5.27
是數值常量、"foo"
是字符串常量的概念類似。
作者聲明:本文用于記錄和分享作者的學習心得,可能有部分文字或示例來自AI平臺,如:豆包、DeepSeek(硅基流動)(注冊鏈接)等,由于本人水平有限,難免存在表達錯誤,歡迎留言交流和指教!
Copyright ? 2022~2025 All rights reserved.