如何在awk模式匹配中传递Shell变量PORT并正确使用
解决awk中传递变量到正则表达式的问题
我来帮你搞定这个awk变量在正则里的使用难题~你之前的写法出错主要是因为没搞清楚awk里变量在正则表达式中的正确引用方式,下面给你拆解原因和正确方案:
为什么你的写法不生效?
- 第一种写法里的
'$p':因为整个awk脚本被单引号包裹,shell不会解析其中的$p,所以awk拿到的是字面量$p,而不是你传递的PORT变量值。 - 第二种写法里的
p:在awk的斜杠正则/.../中,直接写p会被当成字符串"p"处理,而不是你通过-vp=${PORT}传递的变量,自然匹配不到目标端口。
正确的实现方式
推荐用字符串拼接的方式把变量融入正则表达式,这是最稳妥的awk变量引用方法:
lsof -i -P | awk -vp=${PORT} '$(NF-1) ~ "vm7.+:" p "->(vm9|vm11).+ESTABLISHED" {print $(NF-1)}'
这里的逻辑是:
- 用双引号把正则的固定部分包起来
- 直接插入awk变量
p,awk会自动把它替换成传递进来的PORT值 - 所有部分拼接成完整的匹配规则,再用
~进行正则匹配
如果你习惯用match()函数,也可以这么写,效果完全一样:
lsof -i -P | awk -vp=${PORT} 'match($(NF-1), "vm7.+:" p "->(vm9|vm11).+ESTABLISHED") {print $(NF-1)}'
备选方案(shell变量插值)
如果你想沿用斜杠正则的写法,可以先把PORT导出为环境变量,再通过shell插值把值直接传入awk脚本:
export PORT lsof -i -P | awk '$(NF-1)~/vm7.+:'"$PORT"'->(vm9|vm11).+ESTABLISHED/{print $(NF-1)}'
不过这种方式要注意,如果PORT里包含正则特殊字符(比如.、*),可能会干扰匹配逻辑,所以还是优先推荐前面的awk变量传递方式。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

