程式老哥 - 分享知識,不斷成長
http://www.ksdq8.com/
一、簡介
grep (global search regular expression(RE) and print out the line,全面搜尋正規表達式并把行列印出來)是一種強大的文本搜尋工具,它能使用正規表達式搜尋文本,并把比對的行列印出來。
Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的指令隻跟grep有很小不同。egrep是grep的擴充,支援更多的re元字元, fgrep就是fixed grep或fast grep,它們把所有的字母都看作單詞,也就是說,正規表達式中的元字元表示回其自身的字面意義,不再特殊。linux使用GNU版本的grep。它功能更強,可以通過-G、-E、-F指令行選項來使用egrep和fgrep的功能。
二、grep的格式
grep [options] [--color=auto] '搜尋字元串' filename 選項與參數: -c:隻輸出比對行的計數。
-I:不區分大 小寫(隻适用于單字元)。
-h:查詢多檔案時不顯示檔案名。
-l:查詢多檔案時隻輸出包含比對字元的檔案名。
-n:顯示比對行及 行号。
-s:不顯示不存在或無比對文本的錯誤資訊。
-v:顯示不包含比對文本的所有行。
pattern正規表達式主要參數:
\: 忽略正規表達式中特殊字元的原有含義。
^:比對正規表達式的開始行。
$: 比對正規表達式的結束行。
\<:從比對正則表達 式的行開始。
\>:到比對正規表達式的行結束。
[ ]:單個字元,如[A]即A符合要求 。
[ - ]:範圍,如[A-Z],即A、B、C一直到Z都符合要求 。
。:所有的單個字元。
* :有字元,長度可以為0。 --color=auto :可以将找到的關鍵詞部分加上顔色的顯示喔!
1、将/etc/passwd,有出現 root 的行取出來
# grep root /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin 或 # cat /etc/passwd | grep root root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin |
2、将/etc/passwd,有出現 root 的行取出來,同時顯示這些行在/etc/passwd的行号
# grep -n root /etc/passwd 1:root:x:0:0:root:/root:/bin/bash 30:operator:x:11:0:operator:/root:/sbin/nologin |
grep與正規表達式
字元類
字元類的搜尋:如果我想要搜尋 test 或 taste 這兩個單字時,可以發現到,其實她們有共通的 't?st' 存在~這個時候,我可以這樣來搜尋:
[[email protected] ~]# grep -n 't[ae]st' regular_express.txt 8:I can't finish the test. 9:Oh! The soup taste good. |
其實 [] 裡面不論有幾個位元組,他都僅代表某『一個』位元組, 是以,上面的例子說明了,我需要的字串是『tast』或『test』兩個字串而已!
字元類的反向選擇 [^] :如果想要搜尋到有 oo 的行,但不想要 oo 前面有 g,如下
[[email protected] ~]# grep -n '[^g]oo' regular_express.txt 2:apple is my favorite food. 3:Football game is not use feet only. 18:google is the best tools for search keyword. 19:goooooogle yes!
第 2,3 行沒有疑問,因為 foo 與 Foo 均可被接受!
但是第 18 行明明有 google 的 goo 啊~别忘記了,因為該行後面出現了 tool 的 too 啊!是以該行也被列出來~ 也就是說, 18 行裡面雖然出現了我們所不要的項目 (goo) 但是由於有需要的項目 (too) , 是以,是符合字串搜尋的喔!
至於第 19 行,同樣的,因為 goooooogle 裡面的 oo 前面可能是 o ,例如: go(ooo)oogle ,是以,這一行也是符合需求的!
字元類的連續:再來,假設我 oo 前面不想要有小寫位元組,是以,我可以這樣寫 [^abcd....z]oo , 但是這樣似乎不怎麼友善,由於小寫位元組的 ASCII 上編碼的順序是連續的, 是以,我們可以将之簡化為底下這樣:
[[email protected] ~]# grep -n '[^a-z]oo' regular_express.txt 3:Football game is not use feet only.
也就是說,當我們在一組集合位元組中,如果該位元組組是連續的,例如大寫英文/小寫英文/數字等等, 就可以使用[a-z],[A-Z],[0-9]等方式來書寫,那麼如果我們的要求字串是數字與英文呢? 呵呵!就将他此時,就隻剩下第 12 行,因為隻有第 12 行的行首是 the 開頭啊~此外, 如果我想要開頭是小寫位元組的那一行就列出呢?可以這樣:
[[email protected] ~]# grep -n '^[a-z]' regular_express.txt 2:apple is my favorite food. 4:this dress doesn't fit me. 10:motorcycle is cheap than car. 12:the symbol '*' is represented as start. 18:google is the best tools for search keyword. 19:goooooogle yes! 20:go! go! Let's go.全部寫在一起,變成:[a-zA-Z0-9]。
我們要取得有數字的那一行,就這樣:
[[email protected] ~]# grep -n '[0-9]' regular_express.txt 5:However, this dress is about $ 3183 dollars. 15:You are the best is mean you are the no. 1.
行首與行尾位元組 ^ $
行首字元:如果我想要讓 the 隻在行首列出呢? 這個時候就得要使用定位位元組了!我們可以這樣做:
[[email protected] ~]# grep -n '^the' regular_express.txt 12:the symbol '*' is represented as start.
如果我不想要開頭是英文字母,則可以是這樣:
[[email protected] ~]# grep -n '^[^a-zA-Z]' regular_express.txt 1:"Open Source" is a good mechanism to develop programs. 21:# I am VBird
3.grep指令使用簡單執行個體
$ grep ‘test’ d*
顯示所有以d開頭的檔案中包含 test的行。
$ grep ‘test’ aa bb cc
顯示在aa,bb,cc檔案中比對test的行。
$ grep ‘[a-z]\{5\}’ aa
顯示所有包含每個字元串至少有5個連續小寫字元的字元串的行。
$ grep ‘w\(es\)t.*\1′ aa
如果west被比對,則es就被存儲到記憶體中,并标記為1,然後搜尋任意個字元(.*),這些字元後面緊跟着 另外一個es(\1),找到就顯示該行。如果用egrep或grep -E,就不用”\”号進行轉義,直接寫成’w(es)t.*\1′就可以了。
歡迎轉載,請注明來源:http://www.16boke.com/article/detail/198
grep