linux通配符,grep和 egrep區別

前些天寫字符串匹配的腳本,如下:
  1 #!/bin/sh

  2

  3 echo"path: /home/appadmin/workspace"

  4 echo"usage: "$0" [h|cpp|both|all] string_symbol"

  5 echo"space use: grep ' 'str"

  6

  7 if [ $1 = 'h'];

  8 then

  9 find . -name"*\.h" | xargs grep -sn --color $2

 10 fi

 11

 12 if [ $1 = 'cpp'];then

 13 |   find . -name "*\.cpp" | xargs grep-sn --color $2

 14 fi

 15

 16 if [ $1 ='both' ];then

 17 |   find . -name "*[\.h|\.cpp]" |xargs grep -sn --color $2

 18 fi

 19

 20 if [ $1 = 'all'];then

 21 |   find . -name "*" | xargs grep -sn--color $2

 22 fi

已經能滿足查找字符串的功能了, 但爲了實現查找單詞,想盡了各種辦法,未能如願。    (單詞就是  ‘ ’string‘ ’ 這樣的pattern)

使用  

grep ' 'string' '    

grep " string"   

grep "\string\ "

grep \ string\ 等等格式都不行, 上網查詢了下正則表達式。 總結如下:

1. linux 通配符

linux通配符,是系統級別的。 很多shell指令都使用這個規則。 包括  ls stringname /  find . -name"stringname" 等。

* - 通配符,代表任意字符(0到多個)
? - 通配符,代表一個字符
# - 註釋
/ - 跳轉符號,將特殊字符或通配符還原成一般符號
| - 分隔兩個管線命令的界定
; - 連續性命令的界定
~ - 用戶的根目錄
$ - 變量前需要加的變量值
! - 邏輯運算中的"非"(not)
/ - 路徑分隔符號
>, >> - 輸出導向,分別爲"取代"與"累加"
' - 單引號,不具有變量置換功能
" - 雙引號,具有變量置換功能
` - quote符號,兩個``中間爲可以先執行的指令
() - 中間爲子shell的起始與結束
[] - 中間爲字符組合
{} - 中間爲命令區塊組合
Ctrl+C - 終止當前命令
Ctrl+D - 輸入結束(EOF),例如郵件結束的時候
Ctrl+M - 就是Enter
Ctrl+S - 暫停屏幕的輸出
Ctrl+Q - 恢復屏幕的輸出
Ctrl+U - 在提示符下,將整行命令刪除
Ctrl+Z - 暫停當前命令
&& - 當前一個指令執行成功時,執行後一個指令
|| - 當前一個指令執行失敗時,執行後一個指令


其中最常用的是*、?、[]<span style="font-family: Arial,Helvetica, sans-serif;">、</span><span style="font-family:Arial, Helvetica, sans-serif;"> ' 和 " 。下面舉幾個簡單的例子:</span>


1,ls test*            <== *表示後面不論接幾個字符都接受(沒有字符也接受)
2,ls test?           <== ?表示後面當且僅當接一個字符時才接受
3,ls test???      <== ???表示一定要接三個字符
4,cp  test[1~5] /tmp      <== test1, test2, test3, test4, test5若存在,則複製到/tmp目錄下
5,cd /lib/modules/' uname  -r'/kernel/drivers       <== 被 ' ' 括起來的命令先執行 


通配符語法:? 
? 與任何單個字符匹配。例子:
* myfile? 與文件名爲 myfile 後跟單個字符的任何文件匹配。
* /tmp/notes?txt 將與 /tmp/notes.txt 和 /tmp/notes_txt 都匹配,如果它們存在。


通配符語法:[] 
該通配符與 ? 相似,但允許指定得更確切。要使用該通配符,把您想要匹配的所有字符放在 [] 內。結果的表達式將與 [] 中任一字符相匹配。您也可以用 - 來指定範圍,甚至還可以組合範圍。例子:
* myfile[12] 將與 myfile1 和 myfile2 匹配。只要當前目錄中至少有一個這樣的文件存在,該通配符就可以進行擴展。
* [Cc]hange[Ll]og 將與 Changelog、ChangeLog、changeLog 以及 changelog 匹配。您可以看到,與大寫形式的變形匹配時,使用括弧通配符很有用。
* ls /etc/[0-9]* 將列出 /etc 中以數字開頭的所有文件。
* ls /tmp/[A-Za-z]* 將列出 /tmp 中以大寫字母或小寫字母開頭的所有文件。


通配符語法:[!] 
除了不與括弧中的任何字符匹配外,[!] 構造與 [] 構造類似,只要不是列在 [! 和 ] 之間的字符,它將與任何字符匹配。例子:
  * rm myfile[!9] 將刪除除 myfile9 之外的名爲 myfile 加一個字符的所有文件。


通配符告誡說明 
這裏有一些使用通配符時應該注意的告誡說明。由於 bash 對與通配符相關的字符(?、[、]、*)進行特別處理,因此您將包含這些字符的參數輸入到命令中時,需要特別小心。例如,如果您想要創建一個包含字符串 [fo]* 的文件,下面這個命令可能不會執行您想要做的事:
$ echo [fo]* > /tmp/mynewfile.txt
如果 [fo]* 這個模式與當前工作目錄中的任何文件匹配,那麼您將在 /tmp/mynewfile.txt 內發現那些文件的名稱,而不是您所期望的文字 [fo]*。解決方法是什麼呢?嗯,一種方法是用單引號把這些字符括起來,這將告訴 bash 單純地執行,而不會對其進行通配符擴展:
$ echo '[fo]*' > /tmp/mynewfile.txt
採用這種方法,您的新文件將包含所期望的文字的 [fo]*。另一種方法是,您可以使用反斜槓,告訴 bash [、] 和 * 應該被當成文字處理,而不是被當成通配符處理:
$ echo /[fo/].$' /etc/fstab
# /etc/fstab: static file system information.
在上面的示例中,我們用單引號將我們的正則表達式括起來以阻止 shell 解釋 $ 。在不使用單引號的情況下,grep 甚至沒有機會查看 $,$ 就從我們的正則表達式上消失了。

 

2.  grep  使用基本的正則表達

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

錨定行的開始 如:'^grep'匹配所有以grep開頭的行。

$

錨定行的結束 如:'grep$'匹配所有以grep結尾的行。

.

匹配一個非換行符的字符如:'gr.p'匹配gr後接一個任意字符,然後是p。

*

匹配零個或多個先前字符如:'*grep'匹配所有一個或多個空格後緊跟grep的行。 .*一起用代表任意字符。

[]

匹配一個指定範圍內的字符,如'[Gg]rep'匹配Grep和grep。

[^]

匹配一個不在指定範圍內的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一個字母開頭,緊跟rep的行。

..

標記匹配字符,如'love',love被標記爲1。

\<

錨定單詞的開始,如:'\<grep'匹配包含以grep開頭的單詞的行。

\>

錨定單詞的結束,如'grep\>'匹配包含以grep結尾的單詞的行。

x\{m\}

重複字符x,m次,如:'0\{5\}'匹配包含5個o的行。

x\{m,\}

重複字符x,至少m次,如:'o\{5,\}'匹配至少有5個o的行。

x\{m,n\}

重複字符x,至少m次,不多於n次,如:'o\{5,10\}'匹配5--10個o的行。

\w

匹配文字和數字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G後跟零個或多個文字或數字字符,然後是p。

\W

\w的反置形式,匹配一個或多個非單詞字符,如點號句號等。

 

單詞鎖定符,如: '\bgrep\b'只匹配grep。

例子:

grep 'Tomsavage' 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的行.

3. egrep 可以使用基本的正則表達外還可以用擴展表達式

+

匹配一個或多個先前的字符。如:'[a-z]+able',匹配一個或多個小寫字母后跟able的串,如loveable,enable,disable等。

?

匹配零個或多個先前的字符。如:'gr?p'匹配gr後跟一個或沒有字符,然後是p的行。

a|b|c

匹配a或b或c。如:grep|sed匹配grep或sed

()

分組符號,如:love(able|rs)ov+匹配loveable或lovers,匹配一個或多個ov。

x{m},x{m,},x{m,n}

作用同x\{m\},x\{m,\},x\{m,n\}

 

4. 正則表達式的一些用法

\b

匹配一個單詞邊界,也就是指單詞和空格間的位置。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”

\B

匹配非單詞邊界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”

\cx

匹配由x指明的控制字符。例如,\cM匹配一個Control-M或回車符。x的值必須爲A-Za-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的向後引用。如果前面的條件都不滿足,若nm均爲八進制數字(0-7),則\nm將匹配八進制轉義值nm

\nml

如果n爲八進制數字(0-3),且ml均爲八進制數字(0-7),則匹配八進制轉義值nml

\un

匹配n,其中n是一個用四個十六進制數字表示的Unicode字符。例如,\u00A9匹配版權符號(©)。

 

\

將下一個字符標記爲一個特殊字符、或一個原義字符、或一個向後引用、或一個八進制轉義符。例如,“\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}

mn均爲非負整數,其中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

匹配xy。例如,“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”範圍內的任意字符。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章