1. 程式人生 > >linux萬用字元,grep和 egrep區別

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”範圍內的任意字元。

相關推薦

linux字元grep egrep區別

前些天寫字串匹配的指令碼,如下:   1 #!/bin/sh   2   3 echo"path: /home/appadmin/workspace"   4 echo"usage: "$0" [h|cpp|both|all] string_symbol"   5 ech

正則化與字元便於查詢替換批量處理使用在wordnotepad++等文字編輯器中

我們常常使用查詢替換的方式來處理相關資料,可是當你要批量替換隻用一些相同字元分文字時,就會顯得很笨拙。 比如:     Line 5974: DI 10.13182/NT96-A15844     Line 6078: DI 10.1109/ISIC.1996.55623

linux字元正則表示式

1、 萬用字元 萬用字元是shell在做PathnameExpansion時用到的。說白了一般只用於檔名匹配,它是由shell解析的,比如find,ls,cp,mv等。 1、1 Shell常見萬用字元: 萬用字元 含義 例項 * 匹配 0 或多個字元

Linux(七)輸入輸出重定向結合crontab字元正則表示式

目錄 三、管道符 字元匹配 位置匹配 一、輸入輸出重定向 >file       //標準輸出重定向到檔案 -------覆蓋 >>file     //標準輸出重定向到檔案 -------追加 2>         

shell介紹命令歷史命令補全別名字元輸入輸出重定向管道符作業控制

shell介紹 可以使用 yum list |grep zsh 或者 yum list |grep ksh 這樣可以搜尋 zs

python匹配linux字元

有時候需要匹配linux中的萬用字元,例如*和?,它們的含義為:     *:匹配0個或多個字元;     ?:匹配任意單個字元。 這和正則表示式中含義不一樣,在正則表示式中:     *:匹配前一個字元0次或者多次;    &n

Java基礎系列(三十七):泛型繼承字元泛型反射

泛型型別的繼承規則 首先,我們來看一個類和它的子類,比如 Fruit 和 Apple。但是Pair<Apple>是Pair<Fruit>的一個子類麼?並不是。比如下面的這段程式碼就會編譯失敗: Apple[] apples = ...; Pair<F

Linux 字元 及特殊字元 $、\、`、

· 採取一定的規則進行選定。 問號“?”匹配任意一個字元 只能任意匹配一個字元。 星號“*” 匹配任意字串 可以匹配任何字串。 中括號“[]” 範圍內的一個字元 可以匹

字元泛型上下限

一:萬用字元 因為泛型是初始化的時候才確定資料的型別,而接受這個物件或物件的這個屬性的方法確是固定的,所以需要對傳入這個方法的這些個屬性的型別進行判斷和限制,不然,一個只能出來Integer型別的方法如果傳入了String型別,這個方法執行的過程中就會出現錯誤。如果這個方法

Linux 字元 與 正則表示式 的區別與詳解

背景:在linux使用過程中,經常需要查詢檔案,對命令中的萬用字元 pattern 和正則表示式的區分不是很清楚。有必要好好研究一下。 1 掃盲 1.1 萬用字元和正則表示式 當在使用命令列時,有很多時間都用來查詢你所需要的檔案,如 ls find 等。 Sh

Linux中的字元正則表示式

在linux中,有萬用字元和正則表示式,這是兩個不同的概念 萬用字元:它是由shell解析,並且一般用於匹配檔名。如:ls 正則表示式:是一個字元匹配標準,可以匹配文字中的內容 一些命令工具按此標準實現字元匹配,常用於支援正則表示式的工具,如grep,sed等。一般用於匹配檔案中的內

Linux學習之Shell基礎——Bash基本功能——字元其他特殊符號

1、萬用字元 萬用字元 作用 ? 匹配一個任意字元 * 匹配0個或任意多個任意字元,也就是可以匹配任何內容 [ ] 匹配中括號中任意一個字元。例如:[

java執行Linux命令支援字元(*)

java執行linux或者windows命令,這個需求比較常見。 但是若使用  Runtime.getRuntime().exec(cmd); 會發現,若cmd中含有萬用字元,則無法執行,如cp  /dira/*.txt /dirb 可用如下方式執行: String[]

R語言之grep函式正則字元查詢 [

在R語言的道路上又學到了一個新知識,記下來一起分享! 首先,grep函式可以像資料庫查詢一樣對向量中的具有特定條件的元素進行查詢! 其次,介紹幾種R語言中的正則萬用字元: (1)“^”匹配一個字串的開始,比如sub("^a","",c("abcd","dcba")),表示將開頭為a的字串。如果要將開頭的一個

Linux字元正則表示式的區別

在看鳥哥的Linux私房菜的時候看到十二章一直強調萬用字元和正則表示式的區別,在我的理解中,兩者貌似是一樣的都是用來匹配的。Google之網上給出的答案是: 在文字過濾工具裡,都是用正則表示式,比如像awk,sed,等,是針對檔案的內容的 而萬用字元多用在檔名上,比如查詢

R語言之grep函式正則字元查詢

在R語言的道路上又學到了一個新知識,記下來一起分享! 首先,grep函式可以像資料庫查詢一樣對向量中的具有特定條件的元素進行查詢! 其次,介紹幾種R語言中的正則萬用字元: (1)“^”匹配一個字串的開始,比如sub("^a","",c("abcd","dcba")),表

生成線上https證書支援字元多域名初學Let’s Encrypt用於IIS純本地手動

線上一直用的騰訊雲的免費證書(每個域名都要一個證書(滑稽),今天線上用的萬用字元證書也搞定了,實現了一個證書包含多個域名(多個泛域名)。 今年(2018)年初Let’s Encrypt已開放了萬用字元證書的申請《Wildcard Certi

一步一步寫Makefile(2):shell命令字元*%區別檔案路徑搜尋vpath VPATH

#################6:Makefile中也可以插入shell命令################ variable=main.o test1.o test2.o main:$(variable)         cc -o main $(variable)

Linux字元(wildcard)bash下的特殊符號

   在 bash  操作環境中有一個非常有用的功能,那就是萬用字元 (wildcard) !有了wildcard利用 bash 處理資料就方便了!底下我們列出一些常用的萬用字元:          符號                                

Linux下的字元特殊符號用法詳解

在Linu系統中我們會遇到一些特殊符號 ,下面讓我給大家大致說一下 * 代表0個或者多個特殊字元 例子 yum.*