有没有更简单的方法来做到这一点?
grep -v foo file | grep -v bar
使用egrep可能有非常优雅的方法,但是如何使用普通的旧grep呢?
编辑:grep -v 'foo\|bar' file
似乎只适用于 GNU grep。我在索拉里斯。有什么解决办法吗?
答案1
您可以在单个grep
命令中进行多个测试,方法是向每个表达式传递一个-e
参数,而不是像通常看到的那样作为第一个非选项参数:
$ grep -v -e foo -e bar file
这说明了你的命令所做的同样的事情:打印既不file
包含“foo”也不包含“bar”的行。
请记住,-v
完全删除会颠倒这一点;它也改变了逻辑运算!您将获得包含“foo”的所有行或者“酒吧”。
答案2
grep -Ev 'word1|word2'
应该可以正常工作
答案3
您还可以使用花括号进行参数扩展:
grep -v -e{foo,bar}
这实际上等同于:
grep -v -e foo -e bar
(我没有足够的声誉点来添加此评论)
答案4
在 Solaris 11.4 上,如果您PATH
正确设置变量以选择比默认设置稍微更有用的命令行工具,那么您将能够使用
grep -E -v 'foo|bar' file
如果你像这样设置,你将获得更强大的grep
默认功能:grep
PATH
PATH=$(/usr/xpg6/bin/getconf PATH):$PATH
PATH
在默认的 Solaris 11.4 系统上,这会将以下路径添加到现有变量值的前面:
/usr/xpg6/bin:/usr/xpg4/bin:/usr/bin:/opt/developerstudio12.5/bin:/opt/solarisstudio12.4/bin
另请参见man standards
Solaris 系统。