通过 bash shell 脚本传递动态正则表达式

Passing dynamic regexp via bash shell script

我正在编写一个简单的 bash 脚本来将 IP 端口传递给 awk 命令的正则表达式。我只在 Local Destination

中寻找端口

代码如下:

#!/bin/bash
s=
port="/[^0-9]$s$/"
netstat -numeric | awk -v pat="$port" ' == "ESTABLISHED" &&  ~ pat {print}'

这是数据示例。

tcp        0      0  1.9.1.1:23    1.9.2.1:54156 ESTABLISHED
tcp        0      0  1.9.1.1:23    1.9.2.4:51376 ESTABLISHED
tcp        0      0  1.9.1.1:23    1.9.2.1:53299 ESTABLISHED
tcp        0      0  1.9.1.1:23    1.9.2.1:64695 ESTABLISHED
tcp        0      0  1.9.1.1:53086 1.9.1.8:23   ESTABLISHED
tcp        0      0  1.9.1.1:23    1.9.2.1:53296 ESTABLISHED

当我运行脚本时,它returns什么都没有。

当我手动 运行 时,它 returns 如下:

netstat -numeric | awk ' == "ESTABLISHED" &&  ~ /[^0-9]23$/ {print}'

tcp        0      0  1.9.1.1:23    1.9.2.1:54156 ESTABLISHED
tcp        0      0  1.9.1.1:23    1.9.2.4:51376 ESTABLISHED
tcp        0      0  1.9.1.1:23    1.9.2.1:53299 ESTABLISHED
tcp        0      0  1.9.1.1:23    1.9.2.1:64695 ESTABLISHED
tcp        0      0  1.9.1.1:23    1.9.2.1:53296 ESTABLISHED

如有任何建议,我们将不胜感激。

port="[^0-9]$s$"

您可以删除 {print},顺便说一句,因为这是默认操作,所以您只需要:

s=
port="[^0-9]$s$"
netstat -numeric | awk -v pat="$port" ' == "ESTABLISHED" &&  ~ pat'

你没有工作的原因是 /.../ 是正则表达式常量分隔符,就像 "..." 是字符串常量分隔符所以将它们包含在动态正则表达式中就像你包含字符串中的引号,例如foo="\"stuff\"" 而不是 foo="stuff",“/”成为正则表达式的一部分,而不是正则表达式的分隔符。