linux上強大的字符串匹配工具詳解-grep

1. grep 是什麼

grep 是用於匹配輸入數據中符合條件的字符串的工具,其匹配過程支持正則表達式,於是匹配能力很是強大。html

grep 能夠從文件或者標準輸入設備中讀取數據,若不指定任何文件名稱,或是所給予的文件名爲 -,則 grep 會從標準輸入設備讀取數據,不然從文件讀取數據進行匹配。

linux

2. 怎麼用

grep 的命令格式以下:正則表達式

grep [option] pattern file [file2…]


3. 能匹配什麼

咱們先來看看 grep 能匹配什麼,也就是 pattern 參數支持哪些形式。shell

3.1 普通全匹配

這也是最普通的字符串匹配了,直接匹配 pattern 所指的字符串。例如,segmentfault

grep apple file.txt

#匹配結果以下,會直接列出匹配的行
apple
apple

3.2 正則表達式匹配

咱們上面也說到了,grep強大的匹配能力就在於其支持正則表達式,下面咱們來看看 grep 支持的正則表達式語法有哪些。app

首先,grep 默認支持的是如下正則表達式。工具

位置限定匹配
  • 匹配行開頭:^
grep ^a file.txt

匹配a開頭的行,注意是要該行的開頭是a纔會匹配。若是不是在開頭出現,即便中間出現了也不會匹配該行。code

  • 匹配行結尾:$
grep a$ file.txt

匹配a結尾的行,注意是要該行的結尾是a纔會匹配。htm

  • 匹配單詞開頭:\<
grep '\<app' #匹配app開頭的單詞所在的行,例如apple,注意要有引號
  • 匹配單詞結尾:\>
grep 'le\>' #匹配le結尾的單詞所在的行,例如apple,注意要有引號
  • 單詞鎖定匹配:b
grep '\bgrep\b'  #只匹配單詞grep,例如不會匹配到grepa
字符匹配
.        grep .a file.txt #匹配任意一個字符 例如 aa,ba等

[]        grep "[abc]c" file.txt #匹配[]裏的任意一個字符,例如ac或者bc或者cc,注意加引號
        grep "[a-z]a" file.txt #匹配a-z間的26個字母任意一個字符,例如aa
    
[^]        grep "[^ab]a" #匹配除ab以外的任意一個字符,例如da
    
\w        grep "\w"  file.txt #匹配文字和數字字符,也就是[A-Za-z0-9]

\W        grep "\W"  file.txt #\w的反置形式,匹配一個或多個非單詞字符,如點號句號等
次數限定匹配
*        grep "a*b" file.text   # *前面的字符重複0到屢次,例如b,ab,aab

\{m\}    grep "x\{m\}" file.text  #重複字符x,m次,如:grep '0\{3\}'匹配包含3個0的行  

\{m,\}    grep "x\{m,\}" file.text #重複字符x,至少m次,如:'0\{5,\}'匹配至少有5個0的行

\{m,n\}    grep "x\{m,n\}"  #重複字符x,至少m次,很少於n次,如:'0\{5,10\}'匹配5--10個0的行
拓展匹配模式

除了上面默認支持的模式以外,grep 還支持拓展匹配模式,拓展匹配模式要加參數 -E,支持的拓展匹配模式以下:blog

?        grep -E 'go?d' file.txt  #?匹配0個或1個在其以前的字符,例如這裏匹配gd,god

+        grep -E 'go+d' file.txt #?匹配1個或多個在其以前的字符,例如這裏匹配god,good等

()        grep -E 'g(oo)d' file.text #匹配括號裏的字符串,通常都是和其餘匹配模式一塊兒使用,例如 grep -E 'g(oo)?d' file.text

|        grep -E 'god|good' file.txt #匹配被|分隔的多個字符串,例如此例匹配god或者good

注意點

  • 對於標準grep,若是在擴展元字符前面加,grep會自動啓用擴展選項-E。例如,
grep 'go\?d' file.txt
  • 當咱們想要把上面的匹配模式所用到的字符當作普通字符來匹配,須要用到轉義字符"\",不過若是這些特殊字符是位於"[]"當作的時候,大部分都會自動轉義爲普通字符了,除了"-"或者"^"等極少數字符之外。


4. option參數

瞭解了 grep 能匹配哪些數據以後,咱們再來了解下 grep 可用的參數,grep 的參數主要用來影響查找的過程以及打印結果的。

4.1 影響查找過程

-a            將二進制文檔以文本的方式來查找

-d <動做>     當指定要查找的含有目錄(例如 grep apple ./*),必須使用這項參數,不然grep指令將回報信息並中止動做。其中動做支持,skip:跳過目錄,recurse:遞歸讀取目錄的數據

-E             開啓對拓展匹配模式的支持,如上面的例子

-f            指定匹配模式規則文件,其內容含有一個或多個匹配模式規則,格式爲每行一個匹配模式規則。

-F            等同於fgrep命令,也就是fast grep,會把全部的字符都看做普通字符,也就是說正則表達式中的全部字符表示回其自身的字面意義,再也不特殊。

-i            忽略字符大小寫的差異

-r/-R        此參數的效果和指定"-d recurse"參數相同。

-w            單詞匹配,等同於 "\<word\>"或者"\bword\b"

-y            忽略關鍵字符的大小寫。(跟-i參數相同)

4.2 影響打印結果

-A <num>    除了顯示符合模式的那一列以外,再顯示該行以後num行的內容

-B <num>    除了顯示符合模式的那一列以外,再顯示該行以前num行的內容

-b            在匹配到行的開頭標示該行的第一個字符前面總共多少byte數據

-color        以特定顏色高亮顯示匹配關鍵字

-c            僅顯示匹配行的總行數

-C <num>    除了匹配的那一行以外,並顯示該行以前後各num行的內容,其中C是能夠省略的,能夠直接 grep -4 apple file.txt

-h            在顯示匹配的那一行以前,不顯示該行所屬的文件名稱(不加這個參數,匹配多個文件的時候會顯示命中文件的名字)

-H            在顯示匹配的那一行以前,表示該行所屬的文件名稱(不加這個參數,匹配單個文件的時候不會顯示命中文件的名字)

-l            只顯示命中的文件的名稱

-L            只顯示沒命中的文件的名稱

-n             顯示命中的行所在的行數

-o            只顯示匹配的部分,不顯示該行其餘的部分

-P           使用perl的正則表達式語法,由於perl的正則更加多元化,能實現更加複雜的場景。典型用法是匹配指定字符串之間的字符。(-e或-E是匹配擴展正則表達式,-P是匹配perl正則表達式)

-q            不顯示任何信息

-s            不顯示錯誤信息

-v            顯示不包含匹配文本的全部行

-V            顯示版本信息

-x            只顯示整行都符合的列。

參考資料

https://zh.wikipedia.org/wiki/Grep#egrep%E5%92%8Cfgrep
https://www.runoob.com/linux/linux-comm-grep.html
http://www.javashuo.com/article/p-ztgyyxyh-bg.html


Enjoy it !

版權聲明

轉載請註明做者和文章出處
做者: X先生
http://www.javashuo.com/article/p-uftfacnt-nx.html
相關文章
相關標籤/搜索