带有逻辑运算符的grep


19

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

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

我意识到可以使用vanilla grep和其他bash脚本来完成此操作,但我的目标是避免这样做。

grep 

Answers:


12

使用awk和一样perl,您必须将术语包装在中//,但是可以这样做:

awk '(/term1/ && /term2/) || (/term1/ && xor(/term3/, /term4/))' 

28

grep逻辑运算符有很多使用方式。

  1. 使用 \|为分隔多个模式状态。

    例: grep 'pattern1\|pattern2' filename

  2. 使用该-E选项为“ 或” 条件发送多个模式。

    例: grep -E 'pattern1|pattern2' filename

  3. 使用单个-e仅匹配一个模式,但是使用多个 -e选项则匹配多个模式。

    例: grep -e pattern1 -e pattern2 filename

  4. grep -v可以模拟NOT操作。

  5. 中没有AND运算符grep,但是您可以使用选项进行蛮力模拟AND-E

    范例: grep -E 'pattern1.*pattern2|pattern2.*pattern1' filename

    上面的示例将以任何顺序匹配同时包含pattern1pattern2的所有行 。)


1
-E不完全等同于&&由于顺序敏感这一事实
iruvar

grep foo | grep bar是执行AND的更一般的方法。
肯斯特(Kenster),2015年

2
+1是为了清楚地说明没有真正的“ AND”运算符,而我们能做的最好的就是使用OR结构来模拟黑客行为。当然,使用3个以上的词会很麻烦,但是对于2个词,它会很好地工作。
Eric Hepperle-CodeSlayer2010

当您对文件名计数感兴趣时,grep -c -e MATCH1 -e MATCH2非常有用。
andrej

4

您可以使用perl:

perl -wne 'print if (/term1/ && /term2/) || (/term1/ && (/term3/ xor /term4/))'

0
sed '/term1/!d;/term2/b' -e '/term3/!d;/term4/d' *

我相信这可以实现您想要做的事情。它d从输出中删除任何不匹配的行term1,将其b从脚本中淘汰(并自动打印)任何剩余且匹配的行term2,并为保持它删除任何不匹配行term3,并从这些任何一个做匹配term4

sed 脚本是按顺序评估的,并且所有测试都是布尔值,因此测试产生的任何操作都将直接影响以下任何操作的行为。


0

我使用链式grep命令来实现逻辑与:

grep expr1 filename | grep expr2

我相信它非常简单,类似于Unix并且优雅。


然后,您可以将其(如@Tushi详尽解释)与 -E OR-ing和-v求反选项。

您的特定示例非常讨厌,可能会从一些更强大的实用程序中受益(请参阅@muru的答案)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.