跳轉到內容

Grep

100% developed
來自華夏公益教科書,開放的書籍,為開放的世界

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 模式
  • -i: 忽略大小寫。
  • -v: 反轉匹配。
  • -c: 只輸出匹配行的數量。
  • -l: 只輸出匹配的檔案。
  • -n: 在每條匹配行之前加上行號。
  • -b: 一個歷史上的好奇現象:在每條匹配行之前加上塊號。
  • -h: 輸出匹配行,但不要在它們前面加上檔名。
  • -s: 抑制關於不存在或不可讀檔案的錯誤訊息。
  • -x
  • -f 檔案:從檔案中獲取正則表示式。
  • -o: 輸出匹配行中匹配的部分。

GNU grep 的命令列選項,又稱開關,超越了基本的 grep

  • --help
  • -V, --version
  • --regexp=模式,除了 -e 模式
  • --invert-match,除了 -v
  • --word-regexp,除了 -w
  • --line-regexp,除了 -x
  • -A 數值, --after-context=數值
  • -B 數值, --before-context=數值
  • -C 數值, -數值, --context=數值
  • 等等...

連結

正則表示式

[編輯 | 編輯原始碼]

Grep 使用一種特殊的正則表示式版本,不同於 sed 和 Perl。Grep 涵蓋了 POSIX 基本正則表示式(另見 正則表示式/Posix 基本正則表示式)。

grep 中可用的正則表示式功能包括 *、.、^、$、[ ]、[^ ]、\( \)、\n、\{i\}、\{i,j\}、\{i,\}。

GNU grep 中可用的正則表示式功能,作為 GNU 擴充套件,包括 \?、\+、\b、\B、\<、\>、\w、\W、\s、\S。

grep 中帶有 -E 開關可用的正則表示式功能包括 ?、+、|、( )、{i}、{i,j}、{i,}。

grep 支援的預定義字元類包括 [:alpha:]、[:blank:]、[:cntrl:]、[:digit:]、[:graph:]、[:lower:]、[:print:]、[:punct:]、[:space:]、[:upper:] 和 [:xdigit:]。

grep 中不可用的正則表示式功能包括 Perl 的 \d、\D、\A 和 \Z。

連結

當從 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]*"
    • 匹配。 "[" 和 "]" 是字元組的定界符。 "*" 代表 0 個、1 個或任何其他數量的前面內容。
  • echo a456 | grep -i "[A-Z][0-9]\+"
    • 匹配。"\+" 代表前面內容的 1 個或多個出現。與 "*" 不同,"+" 必須以 "\" 開頭。"-i" 使搜尋不區分大小寫。
  • echo file.txt | grep -E ".*(txt|doc)"
    • 匹配。"-E" 代表擴充套件正則表示式。在擴充套件正則表示式中,"(" 和 "|" 不需要 "\" 就可以充當特殊字元;它們需要 "\" 才能充當字面量,也就是說,代表它們自身。
  • echo abbc | grep -E "abb?c"
    • 在 -E 開關啟用的擴充套件正則表示式中,問號匹配前面內容的 0 個或 1 個出現。
  • echo abbc | grep "abb\?c"
    • 在 GNU Grep 中,\?(反斜槓後面的問號)匹配前面內容的 0 個或 1 個出現。
  • 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 Grep 執行的一個例子。

可以從 GNU ftp 伺服器 獲取舊版本的 GNU grep。

GNU grep 的釋出公告在 savannah 組 中。

可以從 git.savannah.gnu.org 獲取 GNU grep 的變更日誌。

可以在 GnuWin32 專案 以及 Cygwin 中獲得用於 MS Windows 的 GNU grep 版本。

[編輯 | 編輯原始碼]
華夏公益教科書