是否有类似 grep 的实用程序,使我能够使用逻辑运算符进行 grep 搜索。我希望能够自由地嵌套和组合逻辑结构。例如,这样的事情应该是可能的:
grep (term1 && term2) || (term1 && (term3 xor term4)) *
我意识到这可以通过普通 grep 和额外的 bash 脚本来完成,但我的目标是避免这样做。
答案1
有很多方法可以使用grep
逻辑运算符。
使用多个
-e
选项匹配与任何模式匹配的任何内容,给出或者手术。例子:
grep -e pattern1 -e pattern2 filename
在扩展正则表达式 (
grep -E
) 中,您可以使用|
组合多个模式或者手术。例子:
grep -E 'pattern1|pattern2' filename
grep -v
可以模拟不是手术。没有和运算符 in
grep
,但您可以暴力模拟和通过使用多种模式与|
.例子 :
grep -E 'pattern1.*pattern2|pattern2.*pattern1' filename
上面的示例将匹配包含两者的所有行 模式1和模式2以任一顺序。如果有更多的模式需要组合,这会变得非常难看。
答案2
使用awk
,与使用 一样perl
,您必须将术语括在 中//
,但可以这样做:
awk '(/term1/ && /term2/) || (/term1/ && xor(/term3/, /term4/))'
请注意,xor()
这是一个非标准 GNU 扩展,它是按位的xor
,而不是逻辑的。这里很好,因为它们/regex/
只返回 0 或 1。
使用 other awk
,您可以将逻辑定义xor()
为函数:
function xor(a, b) {
return (a || b && ! (a && b))
}
或者
function xor(a, b) {
return ((a && !b) || (b && !a))
}
答案3
你可以使用 perl:
perl -wne 'print if (/term1/ && /term2/) || (/term1/ && (/term3/ xor /term4/))'
哪里的开关如下面所述:
-w turns on warnings
-n runs perl against each line of input (looping)
-e executes perl passed in the command line
答案4
我使用链接grep
命令来实现逻辑与:
grep expr1 filename | grep expr2
我相信它非常简单、类似 Unix 且优雅。
然后你可以将(正如@Tushi彻底解释的那样)与-E
OR-ing和-v
否定选项结合起来。
你的具体例子非常令人讨厌,可能会受益于一些更强大的实用程序(参见@muru的答案)。