1. 程式人生 > >grep與egrep區別

grep與egrep區別

其實主要是正則表示式中的一些特殊語法。在網上找的幾篇文章,擷取相關部分貼在了下面,方便以後翻閱。

(little tip:正則表示式中的[[:space:]]跟空格不是完全一樣,他出代表空格字元外,還可代表'\t'。假如hello.c檔案中有一行“int main()”,如果檔案中int 和main之間用的是空格,則egrep "int " hello.c 和egrep"int[[:space:]]" hello.c都可以找到這一行,但如果int 和main之間使用TAB鍵隔開的,則用egrep"int[[:space:]]" hello.c仍可以找到這一行,但用egrep "int " hello.c就不行。)

grep:

格式: grep [option] pattern filename 注意: pattern如果是表示式或者超過兩個單詞的, 需要用引號引用. 可以是單引號也可雙引號, 區別是單引號無法引用變數而雙引號可以.

grep '\<Tom\>' file   包含單詞Tom的行
grep 'Tom savage' file 包含Tom savage的行
grep '^Tommy' file 包含以Tommy開頭的行
grep '\.bak$' file 包含以.bak結束的行
grep '[Pp]yramid' file 包含pyramid 或Pyramid的單詞的行
grep '[A-Z]' file 包含至少一個大寫字母的行
grep '[0-9]' file 包含至少一個數字的行
grep '[A-Z]...[0-9]' file 包含五個字元,以大寫開頭, 和一個數字結尾的行.
grep -w '[tT]est' file 包含單詞和test的行.
grep -s 'ken sun' file 找到包含ken sun的行, 但不列印行, 而是用來檢查退出狀態.
grep -v aaa file 列印不包含aaa的行.
grep -i cathy file 列印所有包含cathy的行, 而不考慮大小些.
grep -l 'dear cathy' * 列印包含dear cathy的檔案的檔名清單.
grep -n tom file   列印匹配的行並追加行號.
grep "$LOGNAME" file 包含變數內容的行, 注意必須用雙引號, 單引號則無法引用變數.
grep '$name' file 列印包含字元$name的行.

egrep:


egrep = grep -E 可以使用基本的正則表達外, 還可以用擴充套件表示式. 注意區別.
擴充套件表示式:
+ 匹配一個或者多個先前的字元, 至少一個先前字元.
? 匹配0個或者多個先前字元.
a|b|c 匹配a或b或c
() 字元組, 如: love(able|ers) 匹配loveable或lovers.
(..)(..)\1\2 模板匹配. \1代表前面第一個模板, \2代第二個括弧裡面的模板.
x{m,n} =x\{m,n\} x的字元數量在m到n個之間.

egrep '^+' file   以一個或者多個空格開頭的行.
grep '^*' file   同上
egrep '(TOM|DAN) SAVAGE' file 包含 TOM SAVAGE 和DAN SAVAGE的行.
egrep '(ab)+' file 包含至少一個ab的行.
egrep 'x[0-9]?' file 包含x或者x後面跟著0個或者多個數字的行.
egrep 'fun\.$' * 所有檔案裡面以fun.結尾的行.
egrep '[A-Z]+' file 至少包含一個大寫字母的行.
egrep '[0-9]' file 至少一個數字的行.
egrep '[A-Z]...[0-9]' file 有五個字元, 第一個式大寫, 最後一個是數字的行.
egrep '[tT]est' file 包含單詞test或Test的行.
egrep 'ken sun' file 包含ken sun的行.
egrep -v 'marry' file 不包含marry的行.
egrep -i 'sam' file 不考慮sam的大小寫,含有sam的行.
egrep -l "dear ken" * 包含dear ken的所有檔案的清單.
egrep -n tom file 包含tom的行, 每行前面追加行號.
egrep -s "$name" file 找到變數名$name的, 不列印而是顯示退出狀態. 0表示找到. 1表示表示式沒找到符合要求的, 2表示檔案沒找到.

在正則下
\ 關閉後續字元的特殊定義,但 \{\}會開啟其特殊定義
. 任何單個字元
* 0個或多個 在它之前的單個字元
  單獨出現時 在BRE中不具有任何意義(因為前面為空 就什麼都沒有)
^ 在BRE中  在表示式開頭處具有意義
  在ERE中  任何位置都有意義
$ 同上,只是他代表的是結尾處
[] 匹配方括號內任一字元
   - 在這裡的意思是連續 ex:1-9  1到9
   ^ 代表非
在方括號表示式中,所有的meta字元都會失去特殊含義
[]*\.-]這個例子比較特殊 對] 跟-  放進[]裡的位置有些許講究
["].*\1 這個的意思是 ''或者“”,
不用擔心單引號先找到或者是雙引號先找到

   
注:BRE 基礎正則表示式 ERE 擴充套件正則表示式
注:
[::] 字符集 ex: [:alpha:] 字母字元 [:alnum:] 數字字元 
    [:upper:] 大寫 [:lower:] 小寫 [:space:] 空格(和'\t')


[..] 多字元序列視為一個單位
[==]等價字符集 對於有音標的才需要

後向引用
  配一個\n 
ex:\1 表示引用前面的一次,那就是() ()  原來有一次,再應用一次
另外注意的是,n代表1-9  最多可以9次的應用,順序是從左開始


元字元 描述
\ 將下一個字元標記為一個特殊字元、或一個原義字元、或一個向後引用、或一個八進位制轉義符。例如,“\n”匹配字元“n”。“\\n”匹配一個換行符。序列“\\”匹配“\”而“\(”則匹配“(”。
^ 匹配輸入字串的開始位置。如果設定了RegExp物件的Multiline屬性,^也匹配“\n”或“\r”之後的位置。
$ 匹配輸入字串的結束位置。如果設定了RegExp物件的Multiline屬性,$也匹配“\n”或“\r”之前的位置。
* 匹配前面的子表示式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等價於{0,}。
+ 匹配前面的子表示式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等價於{1,}。
? 匹配前面的子表示式零次或一次。例如,“do(es)?”可以匹配“does”或“does”中的“do”。?等價於{0,1}。
{n} n是一個非負整數。匹配確定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的兩個o。
{n,} n是一個非負整數。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等價於“o+”。“o{0,}”則等價於“o*”。
{n,m} m和n均為非負整數,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”將匹配“fooooood”中的前三個o。“o{0,1}”等價於“o?”。請注意在逗號和兩個數之間不能有空格。
? 當該字元緊跟在任何一個其他限制符(*,+,?,{n},{n,},{n,m})後面時,匹配模式是非貪婪的。非貪婪模式儘可能少的匹配所搜尋的字串,而預設的貪婪模式則儘可能多的匹配所搜尋的字串。例如,對於字串“oooo”,“o+?”將匹配單個“o”,而“o?”將匹配所有“o”。
.點 匹配除“\n”之外的任何單個字元。要匹配包括“\n”在內的任何字元,請使用像“(.|\n)”的模式。
(pattern) 匹配pattern並獲取這一匹配。所獲取的匹配可以從產生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中則使用$0…$9屬性。要匹配圓括號字元,請使用“”。
(?:pattern) 匹配pattern但不獲取匹配結果,也就是說這是一個非獲取匹配,不進行儲存供以後使用。這在使用或字元“(|)”來組合一個模式的各個部分是很有用。例如“industr(?:y|ies)”就是一個比“industry|industries”更簡略的表示式。
(?=pattern) 正向肯定預查,在任何匹配pattern的字串開始處匹配查詢字串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以後使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。預查不消耗字元,也就是說,在一個匹配發生後,在最後一次匹配之後立即開始下一次匹配的搜尋,而不是從包含預查的字元之後開始。
(?!pattern) 正向否定預查,在任何不匹配pattern的字串開始處匹配查詢字串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以後使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。預查不消耗字元,也就是說,在一個匹配發生後,在最後一次匹配之後立即開始下一次匹配的搜尋,而不是從包含預查的字元之後開始。
(?<=pattern) 反向肯定預查,與正向肯定預查類似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。
(?<!pattern) 反向否定預查,與正向否定預查類似,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。
x|y 匹配x或y。例如,“z|food”能匹配“z”或“food”。“(z|f)ood”則匹配“zood”或“food”。
[xyz] 字元集合。匹配所包含的任意一個字元。例如,“[abc]”可以匹配“plain”中的“a”。
[^xyz] 負值字元集合。匹配未包含的任意字元。例如,“[^abc]”可以匹配“plain”中的“plin”。
[a-z] 字元範圍。匹配指定範圍內的任意字元。例如,“[a-z]”可以匹配“a”到“z”範圍內的任意小寫字母字元。
[^a-z] 負值字元範圍。匹配任何不在指定範圍內的任意字元。例如,“[^a-z]”可以匹配任何不在“a”到“z”範圍內的任意字元。
\b 匹配一個單詞邊界,也就是指單詞和空格間的位置。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。
\B 匹配非單詞邊界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。
\cx 匹配由x指明的控制字元。例如,\cM匹配一個Control-M或回車符。x的值必須為A-Z或a-z之一。否則,將c視為一個原義的“c”字元。
\d 匹配一個數字字元。等價於[0-9]。
\D 匹配一個非數字字元。等價於[^0-9]。
\f 匹配一個換頁符。等價於\x0c和\cL。
\n 匹配一個換行符。等價於\x0a和\cJ。
\r 匹配一個回車符。等價於\x0d和\cM。
\s 匹配任何空白字元,包括空格、製表符、換頁符等等。等價於[ \f\n\r\t\v]。
\S 匹配任何非空白字元。等價於[^ \f\n\r\t\v]。
\t 匹配一個製表符。等價於\x09和\cI。
\v 匹配一個垂直製表符。等價於\x0b和\cK。
\w 匹配包括下劃線的任何單詞字元。等價於“[A-Za-z0-9_]”。
\W 匹配任何非單詞字元。等價於“[^A-Za-z0-9_]”。
\xn 匹配n,其中n為十六進位制轉義值。十六進位制轉義值必須為確定的兩個數字長。例如,“\x41”匹配“A”。“\x041”則等價於“\x04&1”。正則表示式中可以使用ASCII編碼。
\num 匹配num,其中num是一個正整數。對所獲取的匹配的引用。例如,“(.)\1”匹配兩個連續的相同字元。
\n 標識一個八進位制轉義值或一個向後引用。如果\n之前至少n個獲取的子表示式,則n為向後引用。否則,如果n為八進位制數字(0-7),則n為一個八進位制轉義值。
\nm 標識一個八進位制轉義值或一個向後引用。如果\nm之前至少有nm個獲得子表示式,則nm為向後引用。如果\nm之前至少有n個獲取,則n為一個後跟文字m的向後引用。如果前面的條件都不滿足,若n和m均為八進位制數字(0-7),則\nm將匹配八進位制轉義值nm。
\nml 如果n為八進位制數字(0-3),且m和l均為八進位制數字(0-7),則匹配八進位制轉義值nml。
\un 匹配n,其中n是一個用四個十六進位制數字表示的Unicode字元。例如,\u00A9匹配版權符號(©)