2015-07-21 72 views
-1

我已經搜索了很多,無法弄清楚我在這裏做錯了什麼。我有可能包含類似於下面的字符串的文本文件:Grep搜索特定字符故障

/dev/dir1/dir2 200G 22G 179G 11% /usr/dir3/dir4 

我大致知道刺痛將是什麼樣子,直到磁盤百分比指標(即11%),但在的最後部分字符串我需要弄清楚它是否在usr(或sub)目錄中結束。

我想使用grep來做這個搜索,但有問題。例如,下面的命令給我輸出,但是一旦我替換了任何「。」。 「G」或「%」所在的字符,或者如果我試圖在最後添加「/usr/.*」,它拒絕返回任何內容。

$ egrep ^/dev/dir1/dir2\s*\d*.\s*\d*.\s*\d*.\s*\d*.\s*.*$ testfile 
/dev/dir1/dir2 200G 22G 179G 11% /usr/dir3/dir4 
+0

有趣的問題。但是,試着澄清一下你的樣本輸入是什麼,以及應該是什麼樣的輸出。閱讀[ask]以獲得更好的方法 – fedorqui

+1

像這樣的一個沒有引號的模式參數根本不應該工作。你確定它是?使用該命令'grep'可以看到'^/dev/dir1/dir2s * d * .s * d * .s * d * .s * d * .s *。* $'這顯然不是您的意思。在模式中放置單引號是否有幫助?哦!這個不帶引號的模式歸結爲'^/dev/dir1/dir2 ..... * $',這顯然與您的輸入相匹配。它將匹配從該路徑開始的任何事物。但是如果你在任何地方粘貼'G'或'%',也將無法匹配。 –

+0

要回答你的問題,是的,在我上面發佈的內容中沒有引號會返回我粘貼的內容。我也嘗試過用單引號和雙引號括起來,並沒有什麼區別(我在CentOS 6中,如果這很重要......)。一旦我替換: egrep「^/dev/dir1/dir2 \ s * \ d *。\ s * \ d *。\ s * \ d *。\ s * \ d *。\ s *。* $」 testfile 類似於: egrep「^/dev/dir1/dir2 \ s * \ d * [G] \ s * \ d *。\ s * \ d *。\ s * \ d *。\ s *。* $「testfile 它立即無法接通線路。 希望這有助於澄清,試圖解釋,以及我可以。對不起,任何困惑 - 新社區和第一次海報。 – nickm

回答

1

grep的擴展正則表達式不支持使用\d相匹配的數字。相反,請使用[0-9][:digit:]。您可以使用以下grep命令:

egrep '^/dev/dir1/dir2\s*[0-9]*G\s*[0-9]*G\s*[0-9]*G\s*[0-9]*%\s*.*$' 

您也可以通過grep-P選項啓用的Perl兼容的正則表達式,它確實支持\d

grep -P '^/dev/dir1/dir2\s*\d*G\s*\d*G\s*\d*G\s*\d*%\s*.*$' 

注意使用grep代替egrep在上面的命令; -Pegrep不兼容。

作爲一個方面說明,我更喜歡用+而不是*,因爲它更嚴格,可能會導致錯誤更快顯現。例如,我假設輸入中每個位置至少有一個空格和一個數字,因此您可以使用\s+[0-9]+(或\d+)。如果您的原始圖案使用了+,那麼它首先不會匹配(不管它是否被引用),並且在將G%添加到它之前,您會知道您有問題。一個工作示例是

egrep '^/dev/dir1/dir2\s+[0-9]+.\s+[0-9]+.\s+[0-9]+.\s+[0-9]+.\s+.+$' 
+0

謝謝Lithis對這個有用的答案,我沒有意識到這一點。我會根據你的建議看看我是否能夠正常工作。 – nickm