Grep
Grep 是一個 Unix 實用程式,用於搜尋管道到它的資訊或當前目錄中的檔案。 一個例子應該有助於澄清事情。
假設我們想搜尋一個目錄,並且想找到所有名稱中包含字串“hello”的檔案。 你可能會在 shell 中發出 'ls' 命令來列出目錄的內容,然後
$ ls
DumpSite.sh crontab.txt nagios-3.0.6 xmpppy xymon-4.3.0-beta2
並手動檢視所有內容,或者你可以使用 'ls' 命令並將 ls 的輸出管道到 grep
$ ls |grep crontab
crontab.txt
相反,如果你想過濾一個列表,除非某些條目,把它放在引數 -v 中
$ ls |grep -v crontab
DumpSite.sh
nagios-3.0.6
xmpppy
xymon-4.3.0-beta2
'|' 字元是管道的表示,基本上將 'ls' 命令的輸出作為 grep 的輸入。 你應該得到一個不錯的(可能是空的)列表,其中包含所有名稱中包含“hello”的檔案。
對於搜尋詞,grep 可以接受正則表示式而不是普通字串。 一個簡單的例子可能是查詢目錄中的所有 .txt 或 .jpg 檔案
$ ls | grep '.*\(txt\|jpg\)'
這裡的正則表示式由 .* 組成,它可以代表檔名中的任何內容,以及 \(txt\|jpg\),它產生 txt 或 jpg 作為檔案結尾。
命令列選項,也稱為 grep 的開關
- -e pattern
- -i: 忽略大小寫。
- -v: 反轉匹配。
- -c: 僅輸出匹配行的計數。
- -l: 僅輸出匹配檔案。
- -n: 在每行匹配行之前加上行號。
- -b: 一個歷史上的好奇:在每行匹配行之前加上塊號。
- -h: 輸出匹配行,不以檔名作為字首。
- -s: 抑制有關不存在或不可讀檔案的錯誤訊息。
- -x
- -f file: 從檔案獲取正則表示式。
- -o: 輸出匹配行的匹配部分。
命令列選項,也稱為 GNU grep 的開關,超越了基本的 grep
- --help
- -V, --version
- --regexp=pattern,除了 -e pattern
- --invert-match,除了 -v
- --word-regexp,除了 -w
- --line-regexp,除了 -x
- -A num, --after-context=num
- -B num, --before-context=num
- -C num, -num, --context=num
- 等等...
連結
- 2.1 命令列選項 在 grep 手冊,gnu.org
- Unix grep(1) 手冊頁 在 man.cat-v.org,DESCRIPTION 部分
Grep 使用特定版本的正則表示式,不同於 sed 和 Perl。 Grep 涵蓋 POSIX 基本正則表示式(另請參見 正則表示式/Posix 基本正則表示式)。
grep 中可用的正則表示式功能包括 *、.、^、$、[ ]、[^ ]、\( \)、\n、\{i\}、\{i,j\}、\{i,\}。
GNU grep 中作為 GNU 擴充套件可用的正則表示式功能包括 \?、\+、\b、\B、\<、\>、\w、\W、\s、\S。
使用 -E 開關在 grep 中可用的正則表示式功能包括 ?、+、|、( )、{i}、{i,j}、{i,}
grep 支援的預定義字元類包括 [:alpha:]、[:blank:]、[:cntrl:]、[:digit:]、[:graph:]、[:lower:]、[:print:]、[:punct:]、[:space:]、[:upper:] 和 [:xdigit:]。
grep 中不可用的正則表示式功能包括 Perl 的 \d、\D、\A 和 \Z。
連結
- 正則表示式 在 GNU grep 手冊中,gnu.org
當使用從 find 呼叫的 grep 時,讓 grep 輸出檔案的完整路徑,然後輸出匹配的內容非常有用。 為了能夠做到這一點,讓 grep 認為它是用多個檔案呼叫的,在 {} 之後新增 /dev/null,如下所示
find /var/www -exec grep php {} /dev/null \;
grep 使用的示例
echo file.txt | grep ".*\(txt\|doc\)"- 匹配。 "\(" 和 "\)" 建立一個組,而 "\|" 分隔組中的專案。 如果組的至少一個專案匹配,則組匹配。
echo a456 | grep "[a-zA-Z][0-9][0-9]*"- 匹配。 "[" 和 "]" 是字元組的定界符。 "*" 代表零、一個或任何其他數量的先前內容。
echo a456 | grep -i "[A-Z][0-9]\+"- 匹配。 "\+" 代表一個或多個先前內容的出現。 與 "*" 不同,"+" 必須以 "\" 為字首。 "-i" 使搜尋不區分大小寫。
echo file.txt | grep -E ".*(txt|doc)"- 匹配。 "-E" 代表擴充套件正則表示式。 在擴充套件正則表示式中,"(" 和 "|" 不需要 "\" 充當特殊字元;它們需要 "\" 充當字面量,即代表它們自身。
echo abbc | grep -E "abb?c"- 在由 -E 開關啟用的擴充套件正則表示式中,問號匹配零個或一個先前內容的出現。
echo abbc | grep "abb\?c"- 在 GNU Grep 中,\?(反斜槓字首的問號)匹配零個或一個先前內容的出現。
echo a4c | grep -P "a\dc"- 在某些版本的 GNU Grep 中,匹配。 "-P" 代表 Perl 正則表示式;正則表示式中的 "\d" 代表一個數字。
grep -P "\x22hello\x22" file.txt- 在某些版本的 GNU Grep 中,搜尋以引號開頭的字串,後跟“hello”,後跟另一個引號。 利用 -P,它開啟 Perl 正則表示式。 在 Perl 正則表示式中,"\x22" 代表引號,透過代表 ASCII 十六進位制值為 22 的字元。
grep -P "a\t+b" file.txt- 在某些版本的 GNU Grep 中,透過 "\t" 指代製表符(製表符)。 由 -P 啟用。
grep -r "soughtPattern" . --include=*.java- 在某些版本的 GNU Grep 中,遞迴搜尋檔案。 注意代表當前目錄的句點。
grep -Fxv -f file2.txt file1.txt- 輸出集合差集:file1.txt - file2.txt。 使用 -F 將搜尋詞解釋為字面意義,也稱為非正則表示式,-x 僅匹配整行,-v 反轉匹配,-f 從檔案獲取搜尋詞。
grep -Fx -f file1.txt file2.txt- 輸出集合交集:file1.txt 中也存在於 file2.txt 中的那些行。
grep -P "Sch\xc3\xb6nheit" *- 在 unicode UTF-8 編碼檔案中搜索德語單詞“Schönheit”。 利用 -P 利用 Perl 正則表示式;使用 \x 後跟十六進位制數來搜尋 ö 的 UTF-8 編碼,它是 C3B6。 要找出 UTF-8 文字的十六進位制程式碼,請使用支援 UTF-8 的純文字編輯器建立一個包含該文字的檔案,然後使用顯示十六進位制的程式(多個作業系統上的 hexdump)來找到該文字的十六進位制程式碼。 UTF-8 編碼不要與程式碼點混淆;ö 的程式碼點是 F6,而它的 UTF-8 編碼是 C3B6。
grep -a -i -o "[-_a-z0-9 ]\{4,\}" mybinary.o- 在一定程度上模擬 strings 命令,輸出長度至少為 4 的字串序列,用於允許的字串字元的特定標準。 使用 -a 將二進位制檔案視為文字檔案,使用 -o 僅輸出找到的與模式匹配的序列,而不是包含匹配項的行。
nice -19 find /etc /var/www -type f -name "*.php" -exec grep -e foreach -e str_replace -e return.*base64_decode {} /dev/null \; >php-possible-malware.txt- 然後使用此方法分析,它首先顯示最長的行:
cat php-possible-malware.txt | awk '{ print length, $0 }' |sort -n -s -r |head -50 |less
- 然後使用此方法分析,它首先顯示最長的行:
perl -ne "print if /\x22hello\x22/" file.txt- 這不是一個真正的 grep 示例,而是一個 Perl 單行命令,如果 Perl 可用而 grep 不可用,你可以使用它。

可以從 GNU ftp 伺服器 獲取舊版本的 GNU grep。
GNU grep 的釋出公告在 savannah 組 中。
可以從 git.savannah.gnu.org 獲取 GNU grep 的變更日誌。
可以在 GnuWin32 專案 以及 Cygwin 中獲得適用於 MS Windows 的 GNU grep 版本。
- GNU grep 使用者手冊(單頁版) 在 gnu.org 上
- grep(1) OS X 手冊頁 在 developer.apple.com 上
- Unix grep(1) 手冊頁 在 man.cat-v.org 上
- 關於 grep 的維基百科文章