grep 与逻辑运算符

grep 与逻辑运算符

是否有类似 grep 的实用程序,使我能够使用逻辑运算符进行 grep 搜索。我希望能够自由地嵌套和组合逻辑结构。例如,这样的事情应该是可能的:

grep (term1 && term2) || (term1 && (term3 xor term4)) *

我意识到这可以通过普通 grep 和额外的 bash 脚本来完成,但我的目标是避免这样做。

答案1

有很多方法可以使用grep逻辑运算符。

  1. 使用多个-e选项匹配与任何模式匹配的任何内容,给出或者手术。

    例子:grep -e pattern1 -e pattern2 filename

  2. 在扩展正则表达式 ( grep -E) 中,您可以使用 |组合多个模式或者手术。

    例子: grep -E 'pattern1|pattern2' filename

  3. grep -v可以模拟不是手术。

  4. 没有运算符 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彻底解释的那样)与-EOR-ing和-v否定选项结合起来。

你的具体例子非常令人讨厌,可能会受益于一些更强大的实用程序(参见@muru的答案)。

相关内容