2019年7月16日 星期二

grep要注意部分匹配的問題

在使用grep用關鍵字抓文本資料的時候,要注意到部分匹配的問題,舉下面的例子:
  1. grep --color -f patterns.txt file.txt
  2. grep --color -xf patterns.txt file.txt
  3. grep --color -wf patterns.txt file.txt
此三個指令說明如下:
  1. 一般抓文本資料的方法,只要列在patterns.txt裡面每一行的式樣(pattern)有匹配到file.txt那一行裡面隨便哪個部分,就會把結果印出來
  2. -x, --line-regexp:必須要file.txt裡面整行都完全與式樣有匹配才印出結果
  3. -w, --word-regexpfile.txt裡面看起來像一個字(word)的與式樣有匹配才會印出結果。一個字的定義是被`[[:<:]]'與`[[:>:]]'包含一群字元

以下範例,首先是式樣(pattern)存成一個叫做patterns.txt的檔案
sample1
sample3
再來就是要被這些式樣匹配的文本資料file.txt的檔案
sample1
sample2
sample3
sample3
testsample1
test.sample1
sample1.test
sample11
sample12
sample20
sample1-2
sample4,9
sample5
sample6

測試 1:grep --color -f patterns.txt file.txt
sample1
sample3
sample3
testsample1
test.sample1
sample1.test
sample11
sample12
sample1-2
可以看到只要每一行裡面有部分匹配到,結果就會印出來,紅色是匹配到的部分。
在這裡面通常sample11, sample12並不是一般希望抓出來的結果

測試 2grep --color -xf patterns.txt file.txt
-x, --line-regexp又可以稱為完全匹配(exact match),整行都必須要跟式樣一樣
sample1
sample3
sample3

測試 3grep --color -wf patterns.txt file.txt
-w, --word-regexp比較是一般想要抓出來的資料,就是某些字對了就印出來
sample1
sample3
sample3
test.sample1
sample1.test
sample1-2

參考資料

_EOF_

沒有留言:

張貼留言