awk Regex、正則運算子詳細介紹

來源:互聯網
上載者:User

轉載:http://www.cnblogs.com/chengmo/archive/2010/10/11/1847772.html

 

前言:使用awk作為文本處理工具,Regex是少不了的。 要掌握這個工具的Regex使用。其實,我們不必單獨去學習它的Regex。Regex就像一門程式語言,有自己文法規則已經表示意思。 對於不同工具,其實大部分表示意思相同的。在linux眾多文本處理工具(awk,sed,grep,perl)裡面用到Regex。其實就只有3種類型。詳細可以參考:linux
shell Regex(BREs,EREs,PREs)差異比較
。只要是某些工具是屬於某種類型的Regex。那麼它的文法規則基本一樣。 通過那篇文章,我們知道awk的Regex,是屬於:擴充的Regex(Extended Regular Expression 又叫 Extended RegEx 簡稱 EREs)。

 

一、awk Extended Regular Expression (ERES)基礎資料表達式符號介紹

字元 功能
+ 指定如果一個或多個字元或擴充Regex的具體值(在 +(加號)前)在這個字串中,則字串匹配。命令列:

awk '/smith+ern/' testfile

將包含字元 smit,後跟一個或多個 h 字元,並以字元 ern 結束的字串的任何記錄列印至標準輸出。此樣本中的輸出是:

smithern, harry smithhern, anne

? 指定如果零個或一個字元或擴充Regex的具體值(在 ?(問號)之前)在字串中,則字串匹配。命令列:

awk '/smith?/' testfile

將包含字元 smit,後跟零個或一個 h 字元的執行個體的所有記錄列印至標準輸出。此樣本中的輸出是:

smith, alan smithern, harry smithhern, anne smitters, alexis

| 指定如果以 |(垂直線)隔開的字串的任何一個在字串中,則字串匹配。命令列:

awk '/allen | alan /' testfile

將包含字串 allen 或 alan 的所有記錄列印至標準輸出。此樣本中的輸出是:

smiley, allen smith, alan

( ) 在Regex中將字串組合在一起。命令列:

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] 指定Regex與方括弧內 String 變數指定的任何字元匹配。命令列:

awk '/sm[a-h]/' testfile

將具有 sm 後跟以字母順序從 a 到 h 排列的任何字元的所有記錄列印至標準輸出。此樣本的輸出是:

smawley, andy

[^ String] 在 [ ](方括弧)和在指定字串開頭的 ^ (插入記號) 指明Regex與方括弧內的任何字元不匹配。這樣,命令列:

awk '/sm[^a-h]/' testfile

列印至標準輸出:

smiley, allen smith, alan smithern, harry smithhern, anne smitters, alexis

~,!~ 表示指定變數與Regex匹配(代字型大小)或不匹配(代字型大小、驚嘆號)的條件陳述式。命令列:

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

\ (反斜線) 逸出字元。當位於在擴充Regex中具有特殊含義的任何字元之前時,逸出字元除去該字元的任何特殊含義。例如,命令列:

/a\/\//

將與模式 a // 匹配,因為反斜線否定斜杠作為Regex定界符的通常含義。要將反斜線本身指定為字元,則使用雙反斜線。有關反斜線及其使用的更多資訊,請參閱以下關於逸出序列的內容。

 

與PERs相比,主要是一些結合類型表示符沒有了:包括:”\d,\D,\s,\S,\t,\v,\n,\f,\r”其它功能基本一樣的。 我們常見的軟體:javascript,.net,java支援的Regex,基本上是:EPRs類型。

 

二、awk 常見調用Regex方法

  • awk語句中:

awk ‘/REG/{action}’

/REG/為Regex,可以將$0中,滿足條件記錄 送入到:action進行處理.

  • awk正則運算語句(~,~!等同!~)

[chengmo@centos5 ~]$ awk 'BEGIN{info="this is a test";if( info ~ /test/){print "ok"}}'
ok

  • awk內建使用Regex函數

gsub( Ere, Repl, [ In ] )

sub( Ere, Repl, [ In ] )

match( String, Ere )

split( String, A, [Ere] )

詳細函數使用,可以參照:linux awk 內建函數詳細介紹(執行個體)

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.