Linux command - grep
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
指令一樣,只是對象是壓縮文件。