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香蕉|花生,但我不知道如何修复它。
关于出了什么问题的任何想法?谢谢你
你的正则表达式很好。您的问题是您将它匹配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)
匹配主题的开头( ^) 后跟其中一个foo或bar后跟主题的结尾( $)。请注意,括号在这里很重要。^foo|bar$将是^foo(foo在开始时)或bar$(bar在结束时),因此将匹配fooX或Ybar例如。
作为 的替代方案awk,您可以使用grep:
grep -Eixc '(gra|straw) (pes|berry)|banana|peanut' file
Run Code Online (Sandbox Code Playgroud)
-E 使用扩展正则表达式-i 不区分大小写的匹配-x 只匹配整行-c 计算匹配行数