2013-04-02 91 views
3

我想搜索在Unix的精確字紋,Grepping完全匹配的字詞與UNIX

例子:log.txt文件包含以下內容:

aaa 
bbb 
cccaaa ---> this should not be counted in grep output 

我使用下面的代碼 -

count=$? 
count=$(grep -c aaa $EAT_Setup_BJ3/Log.txt) 

輸出。這裏應該==> 1不2,使用上面的代碼即時得到2作爲輸出 東西所以缺少任何一個可以幫助我在這個好嗎?

+0

什麼的'數= $?'怎麼辦呢?它當然不包括比賽的數量。它記錄了grep的退出狀態。 – Jens

回答

6

字邊界匹配是一個可擴展標準POSIX grep工具。它可能可用或不可用。如果你想搜索的話可移植的,我建議你看看perl的替代,在那裏你會用

perl -ne 'print if /\baaa\b/' $EAT_Setup_BJ3/Log.txt 
+0

這應該是「/ \ baaa \ b /」的正則表達式。 \ W搜索不是單詞字符的字符,因此可能會導致一些奇怪的行爲;特別是如果你正在做匹配的反向引用。 \ b會找到一個字邊界(基本上相同的東西,但更強大,沒有匹配一個字符)。 – whitey04

+0

@ whitey04感謝您的有益觀察。我相應地調整了正則表達式。 – Jens

22

使用全字選項:

grep -c -w aaa $EAT_Setup_BJ3/Log.txt 

grep手冊:

-w,--word,正則表達式

只選擇含有形成全字匹配的那些行。測試是,匹配的子字符串必須在行的開頭,或者以非單詞組成字符開頭。

正如註釋-w中提到的是GNU擴展。對於非GNU的grep您可以使用word boundaries

grep -c "\<aaa\>" $EAT_Setup_BJ3/Log.txt 
+0

謝謝你會嘗試恢復回來,如果我遇到任何問題:) –

+3

注意,-w是GNUism,不是一個標準的POSIX grep的選項。 – Jens

+0

請注意,與'\ <...\>'匹配的文字邊界也不是POSIX。更「便攜式」的解決方案是一個perl一個襯裏​​ – Jens