使用awk作為文本處理工具,正則表達式是少不了的。 要掌握這個工具的正則表達式使用。其實,我們不必單獨去學習它的正則表達式。正則表達式就像一門程序語言,有自己語法規則已經表示意思。 對於不同工具,其實大部分表示意思相同的。在linux眾多文本處理工具(awk,sed,grep,perl)裡面用到正則表達式。其實就只有3種類型。詳細可以參考:linux shell 正則表達式(BREs,EREs,PREs)差異比較 。只要是某些工具是屬於某種類型的正則表達式。那麼它的語法規則基本一樣。 通過那篇文章,我們知道awk的正則表達式,是屬於:擴展的正則表達式(Extended Regular Expression 又叫 Extended RegEx 簡稱 EREs)。
一、awk Extended Regular Expression (ERES)基礎表達式符號介紹
字符
功能
+
指定如果一個或多個字符或擴展正則表達式的具體值(在 +(加號)前)在這個字符串中,則字符串匹配。命令行:
awk '/smith+ern/' testfile
將包含字符 smit,後跟一個或多個 h 字符,並以字符 ern 結束的字符串的任何記錄打印至標准輸出。此示例中的輸出是:
smithern, harry smithhern, anne
? 指定如果零個或一個字符或擴展正則表達式的具體值(在 ?(問號)之前)在字符串中,則字符串匹配。命令行:awk '/smith?/' testfile
將包含字符 smit,後跟零個或一個 h 字符的實例的所有記錄打印至標准輸出。此示例中的輸出是:
smith, alan smithern, harry smithhern, anne smitters, alexis
| 指定如果以 |(垂直線)隔開的字符串的任何一個在字符串中,則字符串匹配。命令行:awk '/allen | alan /' testfile
將包含字符串 allen 或 alan 的所有記錄打印至標准輸出。此示例中的輸出是:
smiley, allen smith, alan
( ) 在正則表達式中將字符串組合在一起。命令行:awk '/a(ll)?(nn)?e/' testfile
將具有字符串 ae 或 alle 或 anne 或 allnne 的所有記錄打印至標准輸出。此示例中的輸出是:
smiley, allen smithhern, anne
{m} 指定如果正好有 m 個模式的具體值位於字符串中,則字符串匹配。命令行:awk '/l{2}/' testfile
打印至標准輸出
smiley, allen
{m,} 指定如果至少 m 個模式的具體值在字符串中,則字符串匹配。命令行:awk '/t{2,}/' testfile
打印至標准輸出:
smitters, alexis
{m, n} 指定如果 m 和 n 之間(包含的 m 和 n)個模式的具體值在字符串中(其中m <= n),則字符串匹配。命令行:awk '/er{1, 2}/' testfile
打印至標准輸出:
smithern, harry smithern, anne smitters, alexis
[String] 指定正則表達式與方括號內 String 變量指定的任何字符匹配。命令行:awk '/sm[a-h]/' testfile
將具有 sm 後跟以字母順序從 a 到 h 排列的任何字符的所有記錄打印至標准輸出。此示例的輸出是:
smawley, andy
[^ String] 在 [ ](方括號)和在指定字符串開頭的 ^ (插入記號) 指明正則表達式與方括號內的任何字符不匹配。這樣,命令行:awk '/sm[^a-h]/' testfile
打印至標准輸出:
smiley, allen smith, alan smithern, harry smithhern, anne smitters, alexis
~,!~ 表示指定變量與正則表達式匹配(代字號)或不匹配(代字號、感歎號)的條件語句。命令行:awk '$1 ~ /n/' testfile
將第一個字段包含字符 n 的所有記錄打印至標准輸出。此示例中的輸出是:
smithern, harry smithhern, anne
^ 指定字段或記錄的開頭。命令行:awk '$2 ~ /^h/' testfile
將把字符 h 作為第二個字段的第一個字符的所有記錄打印至標准輸出。此示例中的輸出是:
smithern, harry
$ 指定字段或記錄的末尾。命令行:awk '$2 ~ /y$/' testfile
將把字符 y 作為第二個字段的最後一個字符的所有記錄打印至標准輸出。此示例中的輸出是:
smawley, andy smithern, harry
. (句號) 表示除了在空白末尾的終端換行字符以外的任何一個字符。命令行:awk '/a..e/' testfile
將具有以兩個字符隔開的字符 a 和 e 的所有記錄打印至標准輸出。此示例中的輸出是:
smawley, andy smiley, allen smithhern, anne
*(星號) 表示零個或更多的任意字符。命令行:awk '/a.*e/' testfile
將具有以零個或更多字符隔開的字符 a 和 e 的所有記錄打印至標准輸出。此示例中的輸出是:
smawley, andy smiley, allen smithhern, anne smitters, alexis
\ (反斜槓) 轉義字符。當位於在擴展正則表達式中具有特殊含義的任何字符之前時,轉義字符除去該字符的任何特殊含義。例如,命令行:/a\/\//
將與模式 a // 匹配,因為反斜槓否定斜槓作為正則表達式定界符的通常含義。要將反斜槓本身指定為字符,則使用雙反斜槓。有關反斜槓及其使用的更多信息,請參閱以下關於轉義序列的內容。
與PERs相比,主要是一些結合類型表示符沒有了:包括:”\d,\D,\s,\S,\t,\v,\n,\f,\r”其它功能基本一樣的。 我們常見的軟件:javascript,.net,java支持的正則表達式,基本上是:EPRs類型。
二、awk 常見調用正則表達式方法
awk ‘/REG/{action}’
/REG/為正則表達式,可以將$0中,滿足條件記錄 送入到:action進行處理.
[chengmo@centos5 ~]$ awk 'BEGIN{info="this is a test";if( info ~ /test/){print "ok"}}'
ok
gsub( Ere, Repl, [ In ] )
sub( Ere, Repl, [ In ] )
match( String, Ere )
split( String, A, [Ere] )
詳細函數使用,可以參照:linux awk 內置函數詳細介紹(實例)
通過上面細述,不知道大家有沒有對awk正則表達式有一個更加清楚的認識。 有什麼問題可以與我交流!