使用带有正则表达式的grep来过滤匹配

时间:2008-12-12 20:53:06

标签: grep

我正在尝试使用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

我尝试使用()或引号,但无法找到任何有效的内容。

我该怎么做?

2 个答案:

答案 0 :(得分:62)

问题在于,默认情况下,您需要转义符号以进行适当的更改。也就是说,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自动将第一个非选项参数作为模式。

答案 1 :(得分:5)

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

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

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

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