在多个参数上使用grep -v


12

有没有更简单的方法可以做到这一点? grep -v foo file | grep -v bar

使用egrep可能有非常优雅的方法,但是如何使用普通的旧grep?

编辑:grep -v 'foo\|bar' file似乎仅适用于GNU grep。我在Solaris上。有什么解决办法吗?


奇怪的问题,因为在第一个示例中您执行AND匹配,而在第二个示例中您进行OR匹配。结果只有在非常特殊的条件下才是相同的。
greenoldman

1
不,不是真的。在第二个示例中,-v标志是一个否定。not(A or B) == not(A) and not(B)
rahmu '11

Answers:


21

您可以在单个grep命令中进行多个测试,方法是为每个表达式传递一个-e参数,而不是通常看到的第一个非选项参数:

$ grep -v -e foo -e bar file

那就是说您的命令执行的操作相同:从中打印行file既不包含“ foo”也不包含“ bar”。

请记住,-v完全删除会导致此问题。它也改变了逻辑运算!您将获得所有包含“ foo” “ bar”的行。


12

grep -Ev 'word1|word2' 应该很好


作为替代方案,您可以使用egrep并在管道字符上添加反斜杠:egrep -v 'word1|word2
OldTimer 2011年

原来,这不适用于Solaris grep。我安装了GNU grep,并且运行良好。我将编辑我的问题以使其特定于Solaris。
rahmu 2011年

2
@rahmu \|是GNU grep扩展,但是您可以使用-Eand |运算符以可移植的方式实现相同的目的。
吉尔(Gilles)'所以
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.