将shell变量传递到awk';s模式搜索
在脚本中,我希望搜索使用另一个命令收集的一些端口之间建立的连接,并设置端口变量和特定系统 使用-vp=${PORT}将端口变量传递给awk 但我不知道如何在模式的其余部分中使用“p”。 他的方法不起作用:将shell变量传递到awk';s模式搜索,awk,gawk,Awk,Gawk,在脚本中,我希望搜索使用另一个命令收集的一些端口之间建立的连接,并设置端口变量和特定系统 使用-vp=${PORT}将端口变量传递给awk 但我不知道如何在模式的其余部分中使用“p”。 他的方法不起作用: $ lsof -i -P|awk -vp=${PORT} '$(NF-1)~/vm7.+:'$p'->(vm9|vm11).+ESTABLISHED/{print $(NF-1)}' $ lsof -i -P|awk -vp=${PORT} '$(NF-1)~/vm7.+:'p'->
$ lsof -i -P|awk -vp=${PORT} '$(NF-1)~/vm7.+:'$p'->(vm9|vm11).+ESTABLISHED/{print $(NF-1)}'
$ lsof -i -P|awk -vp=${PORT} '$(NF-1)~/vm7.+:'p'->(vm9|vm11).+ESTABLISHED/{print $(NF-1)}'
尝试一下:
awk -v p="$PORT" '{pat="yourHost(or whatever):"p}$(NF-1)~pat{print $(NF-1)}'
- 用
构建模式(p
),并检查字段pat
(NF-1)
- 您不需要(不应该)在模式中建立
,因为它是最后一个字段
,而不是NF
NF-1
匹配:
$ awk -v p=$port 'match($(NF-1),"vm7.+:" p "->(vm9|vm11)"){print $(NF-1)}'
可能有一些错误,因为没有测试材料。删除已建立的
,因为它位于$NF
,而不是$(NF-1)
(至少在我的系统中)
。。。或者不要:
$ awk -v p=$port '$(NF-1) ~ "vm7.+:" p "->(vm9|vm11)" {print $(NF-1)}'
今天我学到了一些东西。“模式”-aaarghhh!!!!!!总有一天,我会发现是谁在告诉人们使用模式
这个词,而不是regexp
或字符串
或条件
或其他他们真正的意思,然后会有一个清算…:-)。这与您的问题无关,但仅供参考,如果您没有在-v
与其设置的变量(例如-vp=
)之间放置空格,则会使您的脚本不必要地呆呆特定。只要始终包含一个可移植性空间:-vp=
。您的问题包括简洁、可测试的示例输入和预期输出,因此我们可以帮助您,因为现在您正在收集关于如何修复当前方法语法的答案,但我敢打赌,如果我们能够看到您的输入和预期输出,实际上有一个比当前方法更好的解决方案。“现在真的是个XY问题。”埃德蒙顿说。在将变量与正则表达式混合时,始终使用match
。