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
计算匹配行数