GREP:如何搜索值,但同时排除一些匹配

时间:2009-11-26 08:15:50

标签: regex sed grep

我需要一种简化此命令的方法:

grep 'SEARCHTERM' server.log | grep -v 'PHHIABFFH' | grep -v 'Stats'

它应该找到包括SEARCHTERM在内的所有行,但如果其中一个SEARCHTERM行包含PHHIABFFHStats,则排除。

5 个答案:

答案 0 :(得分:6)

为什么要“简化”这个管道? Un * x命令行工具以这样的方式链接。

修改

一些答案​​建议使用特定版本的grep的功能。我喜欢这个,但很有可能这个特定功能在OP使用的grep版本中不存在。

因此,只要我们不知道OP具有什么环境以及他可以使用哪个版本的工具,我建议坚持使用所有版本的工具中的常用功能。

这再次很好地说明了Un * x哲学。

  

很容易低估组合管道和重定向的能力。作为一个有益的例子,Unix Shell作为一个4GL [Schaffer-Wolf]表明,通过这些工具作为框架,可以组合一些简单的实用程序来支持创建和操作表示为简单文本表的关系数据库。

http://www.catb.org/~esr/writings/taoup/html/ch07s02.html#plumbing

答案 1 :(得分:5)

这将有效:

grep 'SEARCHTERM' server.log | grep -Ev 'PHHIABFFH|Stats'

答案 2 :(得分:1)

如果简单只意味着一个带有更多args的命令......

awk '$0 !~ /PHHIABFFH|Stats/ && /SEARCHTERM/' server.log

答案 3 :(得分:0)

你可以使用shell

while read -r line
do
   case "$line" in
    *"Stats"*|*"PHHIABFFH"*) continue;;
    *"SEARCHTERM"* ) echo "$line";;
   esac
done < "file"

答案 4 :(得分:0)

我会这样做:

grep 'SEARCHTERM' server.log | grep -v -e 'PHHIABFFH' -e 'Stats'