2008-12-12 41 views
33

我試圖使用grep與-v作爲反向匹配和-e作爲正則表達式。我無法正確地獲得語法。使用grep與正則表達式來篩選出匹配

我試圖像

tail -f logFile | grep -ve "string one|string two" 

如果我這樣做,這樣就不會過濾 如果我將其更改爲

tail -f logFile | grep -ev "string one|string two" 

我得到

grep: string one|string two: No such file or directory 

我曾嘗試使用()或引號,但一直未能找到任何可行的。

我該怎麼做?

回答

50

問題在於,默認情況下,您需要跳過|以獲得適當的替換。也就是說,grep僅將「foo | bar」解釋爲與文本字符串「foo | bar」匹配,而模式「foo \ bar」(帶有一個轉義的|)匹配「foo」或「bar」。

要應付這種情況,可以使用-E標誌:

tail -f logFile | grep -vE 'string one|string two' 

可替代地,使用egrep的,這相當於grep的-E:

tail -f logFile | egrep -v 'string one|string two' 

此外,-e是可選的,除非你的模式以字面連字符開頭。 grep自動將第一個非選項參數作爲模式。

+0

嘿,學習每天都有新的東西,我以前從未注意到grep上的-E標誌。 – Jay 2008-12-12 20:58:48

+0

此解決方案適用於`MacOS`嗎?我嘗試`歷史| grep -vE'ng | npm'`但它不能按預期工作。 – Sergii 2018-01-02 06:04:21

5

你需要躲避管道符號當使用-e:

tail -f logFile | grep -ve "string one\|string two" 

編輯:或者,作爲@Adam指出的那樣,你可以使用-E標誌:

tail -f logFile | grep -vE "string one|string two"