grep 是一個簡單的字串擷取工具,可以透過正規表達式 (RE) 來進行字串比對,然後將符合使用者需求的字串列印出來。

每次查 Linux 指令的時候一定會找到鳥哥的教學,這次也不例外,這篇也是參考鳥哥的教學文

grep

在資料中查尋一個字串時,是以”整行”為單位來進行資料的擷取的。也就是說,假如一個檔案內有 10 行,其中有兩行具有你所搜尋的字串,則將那兩行顯示在螢幕上,其他的就丟棄了。

Basic grep

先來看個簡單的指令:

grep [-acinv] [--color=auto] '搜尋字串' filename 

這個指令的選項與參數如下:
-a:將 binary 檔案以 text 檔案的方式搜尋資料
-c:計算找到’搜尋字串’的次數
-i:忽略大小寫
-n:輸出行號
-v:反向選擇,即顯示出沒有’搜尋字串’內容的那幾行
–color=auto:將找到的關鍵字加上顏色

所以當我下這個指令:

grep -n –color=auto ‘and’ data

會出現這個結果:

這份 20 行的資料中,含有 ‘and’ 的那幾行都被我找出來了。

grep with Regular Expression

剛剛說 grep 可以搭配 Regular Expression(RE) 一起使用,其實就是把 RE 寫在指令中’搜尋字串’的地方。

比如說我想搜尋 test 或 taste 這兩個單字時,可以發現他們有共通的 ‘t?st’ 存在。這個時候,我可以這樣來搜尋:

grep -n –color=auto ‘t[ae]st’ data

結果可以看到有 test 或 taste 的句子都被抓出來了:

除此之外,還有一些特殊符號的集合可以使用。比如說一般要找所有小寫字母會寫成 [a-z],在這裡可以用 [:lower:] 代替,找出來會是一樣的結果。

其他特殊符號可以參考這張表:

於是我開始試了很多 RE 符號,包括句首 ^、句尾 $、任一字元 .、任意重複字元 *、跳脫字元 \等等,都可以直接使用,但是寫到 “或 |“的時候,出錯了QQ 於是又到了 Google 大神出動的時候了。

grep with Extended RE

查了之後發現是因為 grep雖然支援兩套 syntax,但是預設的那套 Basic RE 沒有支援 “|“ 這個符號,所以必須使用另一套 Extended RE。而使用的方法也很簡單,只要在指令中加入 -E就可以了。

-E, –extended-regexp Interpret PATTERN as an extended regular expression (ERE). (-E is specified by POSIX.)

馬上來試試:

grep -n -E –color=auto ‘and|or’ data

這個指令可以抓到含有 ‘and’ 或是 ‘or’ 的句子:

Miscellaneous

最後補充一些小東西:

  • 如果想要把印出的結果輸出成一個檔案,可以在輸入檔後面加上 output_filename,例如這樣:
    grep -n -E --color=auto 'and|or' data>outdata
  • 當要從多個檔案尋找字串,又不希望輸出檔內含有字串來源,可以在選項中加上 -h 來處理,如果沒有加 -h會使得輸出檔的每個字串前面有一個檔名,也就是告訴你這個字串來自於哪個檔案。加入 -h 可以像這樣:
    grep -h -E --color=auto 'and|or' data>outdata
  • 另外還有個指令叫做 zgrep,這個指令的功能是在壓縮文件中尋找字串,用法和 grep 指令一樣,只是對象是壓縮文件。