57

我正在尝试将 grep 与 -v 一起用于反转匹配以及 -e 用于正则表达式。我无法正确使用语法。

我正在尝试类似的东西

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

我曾尝试使用 () 或引号,但找不到任何有效的方法。

我怎样才能做到这一点?

4

2 回答 2

92

问题是,默认情况下,您需要转义 | 以获得正确的交替。也就是说,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 自动将第一个非选项参数作为模式。

于 2008-12-12T20:57:06.770 回答
7

使用 -e 时需要转义管道符号:

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

编辑:或者,正如@Adam指出的那样,您可以使用 -E 标志:

tail -f logFile | grep -vE "string one|string two"
于 2008-12-12T20:57:47.453 回答