我对以下 awk 语法有疑问
echo " param1 param2 param3 = param1 AA , AB , AC , AD " | awk -F"=" '$2~/AA|AB|AC|AD/{print "passed"}'
awk 打印已通过,但不应该这样,因为在“=”之后我有 param1,而不是“AA”或 AB”等
awk 的目标是仅当“=”后的字符串是 AA 或 AB 或 AC 或 AD 时才打印通过
如果“=”后面还有其他内容,那么就不应该打印已传递的内容
如何修复 awk 语法?
莉迪亚
答案1
在 之后=
,您得到了字符串param1 AA , AB , AC , AD
。您的 awk 表达式接受任何符合以下条件的字符串:包含 AA
或AB
或AC
或AD
。如果您希望这些单词出现在字段的开头,则需要固定模式(以 开始以^
仅在开头匹配,以 '$' 结束以仅在结尾匹配)。例如,以下表达式要求字段仅是指定的单词之一,前后可能带有空格:
$2 ~ /^ *(AA|AB|AC|AD) *$/
答案2
这个 awk 表达式用于在字段开头搜索 AA,即 ^AA,或者用于在 = 和 AA 之间允许零个或多个空格,即 ^ *AA,因此,如果 = 后的第一个术语是 AA OR BB OR AC OR AD 且前面有零个或多个空格,则此表达式应该只打印通过。
awk -F"=" '$2~/^ *AA|^ *AB|^ *AC|^ *AD/{print "passed"}'