将shell变量传递到awk';s模式搜索

将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'->

在脚本中,我希望搜索使用另一个命令收集的一些端口之间建立的连接,并设置端口变量和特定系统

使用-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'->(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