2008-12-12 40 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"