grep 是用於匹配輸入數據中符合條件的字符串的工具,其匹配過程支持正則表達式,於是匹配能力很是強大。html
grep 能夠從文件或者標準輸入設備中讀取數據,若不指定任何文件名稱,或是所給予的文件名爲 -
,則 grep 會從標準輸入設備讀取數據,不然從文件讀取數據進行匹配。
linux
grep 的命令格式以下:正則表達式
grep [option] pattern file [file2…]
咱們先來看看 grep 能匹配什麼,也就是 pattern
參數支持哪些形式。shell
這也是最普通的字符串匹配了,直接匹配 pattern
所指的字符串。例如,segmentfault
grep apple file.txt #匹配結果以下,會直接列出匹配的行 apple apple
咱們上面也說到了,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,注意要有引號
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 'go\?d' file.txt
瞭解了 grep 能匹配哪些數據以後,咱們再來了解下 grep 可用的參數,grep 的參數主要用來影響查找的過程以及打印結果的。
-a 將二進制文檔以文本的方式來查找 -d <動做> 當指定要查找的含有目錄(例如 grep apple ./*),必須使用這項參數,不然grep指令將回報信息並中止動做。其中動做支持,skip:跳過目錄,recurse:遞歸讀取目錄的數據 -E 開啓對拓展匹配模式的支持,如上面的例子 -f 指定匹配模式規則文件,其內容含有一個或多個匹配模式規則,格式爲每行一個匹配模式規則。 -F 等同於fgrep命令,也就是fast grep,會把全部的字符都看做普通字符,也就是說正則表達式中的全部字符表示回其自身的字面意義,再也不特殊。 -i 忽略字符大小寫的差異 -r/-R 此參數的效果和指定"-d recurse"參數相同。 -w 單詞匹配,等同於 "\<word\>"或者"\bword\b" -y 忽略關鍵字符的大小寫。(跟-i參數相同)
-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