仅当多个模式匹配时,Grep排除行

时间:2015-02-11 14:36:42

标签: regex shell grep regex-negation

我想找到不包含"path": "/""User-Agent": "curl的行。应包含仅包含其中一行的行。

换句话说,只有在符合多个模式时才能排除一行?

3 个答案:

答案 0 :(得分:3)

使用awk更好地完成同一行中的这些双重检查:

awk '! (/"path": "\/"/ && /"User-Agent": "curl/)' file

这使用逻辑awk '! (condition1 && condition2)',因此只要找到两个字符串就会失败。

测试

$ cat a
"path": "/" and "User-Agent": "curl
"path": "/" hello
bye "User-Agent": "curl
this is a test
$ awk '! (/"path": "\/"/ && /"User-Agent": "curl/)' a
"path": "/" hello
bye "User-Agent": "curl
this is a test

答案 1 :(得分:0)

你可以使用|在grep命令中发出“或”信号,你可以使用-v参数来

这样:

grep -v \"path\"\:\ \"/\"\\\|curl

会打印不包含“path”的每一行:“/”或curl。

答案 2 :(得分:0)

这个awk应该做的工作:

awk '(/"path": "\/"/ && !/"User-Agent": "curl/) || 
     (!/"path": "\/"/ && /"User-Agent": "curl/)
     {print FILENAME ":" $0}' *

采用这种方法:

awk '(/match1/ && !/match2/) || (!/match1/ && /match2/)' *

所以换句话说,如果两个单词中的任何一个匹配,则打印,但是当两个单词匹配时不打印。