使用带正则表达式的grep筛选匹配项

使用带正则表达式的grep筛选匹配项,grep,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 我尝试过使用()或引

我试图使用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
我尝试过使用()或引号,但没有找到任何有效的方法


我该怎么做呢?

问题是,默认情况下,您需要避开您的|来获得适当的替换。也就是说,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自动将第一个非选项参数作为模式。

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

tail -f logFile | grep -ve "string one\|string two"
编辑:或者,如前所述,您可以使用-E标志:

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

呵呵,每天学习新东西,我以前从来没有注意到grep上的-E标志。这个解决方案适用于
MacOS
?我尝试了
history | grep-vE'ng | npm'
,但它没有按预期工作。@Sergii:是的,macOS附带的grep版本(BSD grep)完全支持
-v
-E
标志。“不起作用”是一个模糊的描述,你必须提供更多的细节。我建议你问一个新问题,而不是在这里发表评论。我在我的系统上测试了第一部分,它得到了预期的结果。不知道你说的不准确是什么意思。