运算符的 awk 正则表达式

Hew*_*itt 4 awk pattern-matching

我想用我的 awk 正则表达式计算和总结文件中的匹配数。

该文件file包含:

Gra pes
gra ndma
straw berry
blue Berry
banana
peanut
school
Run Code Online (Sandbox Code Playgroud)

我需要为模式匹配制作一个正则表达式,但我不确定如何在正则表达式中实现AND/OR,尽管它们具有相同的优先级。

我试过了:

awk 'tolower($1) ~ /(gra|straw) (pes|berry)|banana|peanut/ {sum+=1} END {print sum+0}' file
Run Code Online (Sandbox Code Playgroud)

所以它应该是两者之一(gra pes, gra berry, straw pes, straw berry) OR banana, peanut并返回 4,因为有 4 个匹配项。

我假设我的语法错误与OR香蕉|花生,但我不知道如何修复它。

关于出了什么问题的任何想法?谢谢你

Sté*_*las 5

你的正则表达式很好。您的问题是您将它匹配tolower($1)第一个字段(以 的默认值分隔的空白FS)转换为小写。

因此,例如,在第一行 ( Gra pes) 上,它将匹配正则表达式gra并失败。

对于整个记录,您需要$0

awk 'tolower($0) ~ /regexp/ ...'
Run Code Online (Sandbox Code Playgroud)

另请注意,默认情况下不锚定正则表达式,因此,它将匹配peanutbutter例如在其中peanut找到的内容。如果您希望正则表达式整体匹配输入记录,您需要:

awk 'tolower($0) ~ /^(foo|bar)$/'
Run Code Online (Sandbox Code Playgroud)

匹配主题的开头( ^) 后跟其中一个foobar后跟主题的结尾( $)。请注意,括号在这里很重要。^foo|bar$将是^foofoo在开始时)或bar$bar在结束时),因此将匹配fooXYbar例如。


pLu*_*umo 5

作为 的替代方案awk,您可以使用grep

grep -Eixc '(gra|straw) (pes|berry)|banana|peanut' file
Run Code Online (Sandbox Code Playgroud)
  • -E 使用扩展正则表达式
  • -i 不区分大小写的匹配
  • -x 只匹配整行
  • -c 计算匹配行数