grep技巧(-r):在某一目錄下遞迴[所有子目錄]查詢某一字串:+檔案路徑
在某一目錄下遞迴[所有子目錄]查詢某一字串:
grep -r “字串” 目錄名
就是加一個-r引數,請看man page:
-R, -r, –recursive
Read all files under each directory, recursively; this is equivalent to the -d recurse option.
grep -Rl "3306" * 這句可以顯示在哪個檔案裡包含3306
grep -REn "3306" * 可以顯現檔名,行數
R 表示遞迴,就是在當前目錄找不到就去子目錄找
E 表示把檔名也打印出來
n 列印此行在檔案中的位置。
Unix 的grep家族包括grep,egrep和fgrep。Grep的命令在檔案中搜索正則表示式,並列印所有包含這些表示式的行。Egrep和fgrep命令只跟grep有很小的不同。Egrep是grep的擴充套件,支援更多的RE元字元。Fgrep就是fixed grep 或者 fast grep,它們把所有的字母都看作單詞。這就是說,正則表示式的元字元不再特殊――他們只表示其自身的字母意思。
Grep的意思是“全面搜尋正則表示式並把找到的行打印出來(global search regular expression(RE) and print out the line
Grep的正則表示式元字符集(基本集)
元字元 | 功能 | 例子 | 匹配什麼 |
^ | 錨定行的開始 | /^love/ | 匹配所有以love開頭的行 |
$ | 錨定行的結束 | /love$/ | 匹配所有以love 結束的行 |
. | 匹配一個字元 | /l..e/ | 匹配這樣的行,這些行包含這樣的字元:第一個字元是l,緊跟著兩個字元,然後是e |
* | 代表0個或多個先前字元 | /*love/ | 匹配所有這樣的行,有0個或多個空格,空格後跟著love |
[] | 匹配字元組中的一個字元 | /[Ll]ove/ | 匹配所有包含love或者Love的行 |
[^] | 匹配一個不在範圍內的字元 | /[^A-Z]ove/ | |
< | 錨定單詞的開始 | <love | 匹配所有這樣的行,這些行包含以love開頭的單詞(vi和grep支援這個功能) |
> | 錨定單詞的結束 | Love> | 匹配所有這樣的行,這些行包含以love結束的單詞(vi和grep支援這個功能) |
(..) | 標記後面用到的匹配字元 | /(love)able1rs/ | 最多可以使用9個標籤。第一個標籤是模板最左邊的部分。在本例子中,模板love儲存的標籤為1,後面的1指得就是love;本例子搜尋的是這樣的行,這些行包含這樣的字元,在Loveabel後面跟著lovers |
x{m} | M次複製字元x | ||
x{m,} | 至少m次複製字元x | ||
x{m,n} | 至少m次,至多n次複製字x | ||
w | 文字和數字字元,[A-Za-z0-9] | Lw*e | 匹配一個l字元,緊跟著0個或多個文字或數字字元,然後是e |
W | 同上 | ||
b | 單詞分界線 | bloveb | 僅僅匹配單詞love |
擴充套件集(用於egrep和grep-E)
+ | 匹配一個或者多個先前字元 | [a-z]+ove | 匹配一個或者多個小寫字元且後面是ove的, |
? | 匹配0個或者多個先前字元 | Lo?ve | P匹配l後面有一個或者沒有o,然後是ve |
a|b|c | 匹配a或b或c | Love|hate | 匹配love或hate其中一個 |
() | 字元組 | Love(able|rs)(ov)+ | 匹配loveable或lovers,匹配一個或多個ov |
(…)(…)12 | 標記匹配字串 | (love)ing | 標籤標記出暫存器的一部分,並稍後替換模板。該模板叫做1,並可反覆引用。在表示式中最多可以使用9個這樣的標籤。例如,模板love被儲存在暫存器1中並稍後替換標籤叫做1 |
x{m} | 重複字元X,m次,至少m,或者m次和n次之間。 | ||
x{m,} | |||
x{m,n} |
Grep和退出狀態
Grep命令在shell教本中非常有用,因為它通過返回一個退出狀態值來說明是否找到了你要搜尋的模板或者檔案。如果模板找到,grep返回狀態值0,表示成功;如果無法找到模板,則返回退出狀態值1;如果檔案無法找到,就返回退出狀態值2(linuxunix使用的其他搜尋程式並不返回退出狀態值,只在出現語法錯誤的時候返回錯誤)。
[[email protected] posftp]$ grep 'john' /etc/passwd
[[email protected] posftp]$ echo $?
1
[[email protected] posftp]$echo $status
Grep與選項
Gun grep 選項
-b 在搜尋到的行為的前面列印該行所在的塊號碼。該功能在通過內容定位塊的號碼時非常有用.
-c 只顯示有多少行匹配,而不具體顯示匹配的行
-h 不顯示檔名
-I 在字串比較的時候忽略大小寫
-l 只顯示包含匹配模板的行的檔名清單,不同專案之間用換行符分割
-n 在每一行前面列印該行在檔案中的行數
-s 靜默工 作,除非出現錯誤資訊,否則不列印任何資訊,這個功能在檢測退出狀態的時候有用
-v 反檢索,只顯示不匹配的行
-w 如果被< 和>引用,就把表示式做為一個單詞搜尋只在grep中 有效(不是所有版本的grep都支援該特性,sco unix的grep就不支 持)
所有gun幹部都可以使用的grep選項(-G,-E和-F)
選項 | 功能 |
-# | 表示同時顯示匹配上下的#行,例如:grep -2 pattern filename 表示同時顯示匹配行上下各兩行 |
-A#,--after-context=# | 在匹配指定的內容的行列印完畢後,再列印一行#號 |
-B#,--before-context=# | 在匹配模板的行的前面列印一行#號 |
-C,--context | 相當於選項-2,在匹配行的前後各列印2行空行 |
-V,--version | 顯示包括bug報告在內的版本資訊 |
-b,--byte-offset | 在每一行前面列印字元偏移量 |
-c,--count | 列印每個檔案匹配行的個數 |
-e PATTERN,--regexp=PATTERN | 使用PATTERN的字面意思作為模板,在模板以“-”開頭的時候非常有用 |
-f FILE,--file=FILE | 從FILE中提取模板。空檔案中包含0個模板,所有什麼也不匹配 |
-h,--no-filename | 當多個檔案匹配時候,不顯示匹配檔名字首 |
-i,--ignore-case | 在模板和輸入檔案中都忽略大小寫差別 |
-L,--files-without-match | 列印不匹配模板的檔名清單 |
-I,--files-with-matches | 列印匹配模板的檔名清單 |
-n,--line-number | 在匹配的行前面列印行號 |
-q,--quit | 取消標準輸出,跟-n功能是一樣的 |
-s,--silent | 不顯示關於不存在或者無法讀取檔案的錯誤資訊 |
-v,--revert-match | 列印不匹配模板的行 |
-w,--word-regexp | 只打印以單詞形式匹配模板的行,模板可以是包含數字,字元和下劃線的字符集 |
-x,--line-regexp | 只打印正行匹配的行 |
-y | 用法同-i |
-U,--binary | 把檔案作為二進位制檔案,這個選項只在MS-DOS和MS-Windows中被支援 |
-u,--unix-byte-offsets | 按照unix風格報告字元偏移量。只在-b選項同時被使用的時候才有效。這個選項只在MS-DOS和MS-Windowns中被支援 |
例子:
grep Tom /etc/passwd
在檔案/etc/passwd中搜索模板Tom,如果成功,搜尋的行將顯示在螢幕上。
Ps aux | grep root
Ps命令輸出(pa aux顯示系統中執行的所有程序)被髮送給grep,所有包含root的行都將被列印。
正則grep例項(grep ,grep –G)
grep NW datafile
grep –G NW datafile
列印檔案datafile中包含正則表示式NW的行
grep NW d*
列印所有以d 開頭的檔案中且包含正則表示式NW的行。Shell擴充套件d*表示所有以d開頭的檔案。
Grep ‘^n’ datafile
列印所有以n開頭的行,^表示錨定行的開頭。
Grep TB Savage datafile
因為第一個引數是模板,其他的引數是檔名,所以grep將在檔案Savage和datafile中搜索TB.
Grep ‘TB Savage’ datafile
列印所有包含模板TB Savage的行。如果沒有引用(在本例子中,單引號和雙引號的作用是一樣的)。TB與Savage之間的空格將導致grep在檔案Savage和datafile中搜索TB。
Gun grep選項例子
grep -2 patricia datafile
列印匹配patricia的行以及該行的上下各兩行。
Grep –C patricia datafile
選項-C跟選項-2的功能是一樣的。
Grep –A 2 patricia datafi