Awk检查两个字段是否匹配同一字符串的简明方法

Awk检查两个字段是否匹配同一字符串的简明方法,awk,Awk,我想检查两个字段是否与特定模式匹配,这是我到目前为止得到的结果: openstack浮动ip列表-f值| awk'$3~/None/&&$4~/None/{print$2}' 如果第三个和第四个字段等于“无”,它将打印第二个字段,这正是我想要的,但它似乎效率低下 使用awk是否有更简洁的方法来执行此操作?如果要检查是否相等,应使用=(或!=)运算符,该运算符效率更高,因为它不需要执行正则表达式匹配: awk '$3 == "None" && $4 == "None" {print

我想检查两个字段是否与特定模式匹配,这是我到目前为止得到的结果:

openstack浮动ip列表-f值| awk'$3~/None/&&$4~/None/{print$2}'

如果第三个和第四个字段等于“无”,它将打印第二个字段,这正是我想要的,但它似乎效率低下


使用
awk
是否有更简洁的方法来执行此操作?

如果要检查是否相等,应使用
=
(或
!=
)运算符,该运算符效率更高,因为它不需要执行正则表达式匹配:

awk '$3 == "None" && $4 == "None" {print $2}'

其余的看起来不错。

如果要检查是否相等,应使用
=
(或
!=
)运算符,该运算符效率更高,因为它不需要执行正则表达式匹配:

awk '$3 == "None" && $4 == "None" {print $2}'
剩下的看起来不错。

你可以:

awk '$3$4~/None{2}/{print $2}'
但如果$3包含“NoneNone”,而$4为空,那么这将产生一个错误的匹配,等等。所以YMMV会写出数据实际包含的内容。您可以将其调整为:

awk '$3" "$4" " ~ /(None ){2}/{print $2}'
但现在有点模糊了。改进脚本的唯一明智方法就是不要多次使用相同的硬编码值:

awk -v n="None" '$3==n && $4==n{print $2}'
你可以做:

awk '$3$4~/None{2}/{print $2}'
但如果$3包含“NoneNone”,而$4为空,那么这将产生一个错误的匹配,等等。所以YMMV会写出数据实际包含的内容。您可以将其调整为:

awk '$3" "$4" " ~ /(None ){2}/{print $2}'
但现在有点模糊了。改进脚本的唯一明智方法就是不要多次使用相同的硬编码值:

awk -v n="None" '$3==n && $4==n{print $2}'

如果希望字段完全匹配,则应使用
$3==“无”
。否则,我看不出您的方法有任何错误。为什么您要关心使代码更简洁?它是简明扼要的。我想你可以去掉空格,但这只会使它更难阅读,而不是更简洁。你的剧本只有30多个字;这不值得担心(除了注释和答案中讨论的equality vs regex更改)。如果希望字段完全匹配,那么应该使用
$3==“None”
。否则,我看不出您的方法有任何错误。为什么您要关心使代码更简洁?它是简明扼要的。我想你可以去掉空格,但这只会使它更难阅读,而不是更简洁。你的剧本只有30多个字;这不值得担心(除了评论和回答中讨论的平等与正则表达式的变化)。这是一个可行的替代方案吗<代码>'$3==$4=“None”{print$2}'@George不,不会。
awk'$3==$4&&$4==“None”
@karakfa,这是一个非常好的awk高尔夫运动,效果非常好。这是一个可行的替代方案吗<代码>'$3==$4=“无”{print$2}'@George不,它不会。
awk'$3==4&&$4==“无”
@karakfa,这是一个非常棒的awk高尔夫,非常棒。