我正在编写一个简单的bash脚本,将IP端口传递给regexp到awk命令。我正在寻找仅在本地目的地的端口
以下是代码:
#!/bin/bash
s=$1
port="/[^0-9]$s$/"
netstat -numeric | awk -v pat="$port" '$6 == "ESTABLISHED" && $4 ~ 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
当我运行脚本时,它什么都不返回。
当我手动运行它时,它会返回以下内容:
netstat -numeric | awk '$6 == "ESTABLISHED" && $4 ~ /[^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
任何建议都会非常感激。
答案 0 :(得分:4)
port="[^0-9]$s$"
您可以删除{print}
,顺便说一句,因为这是默认操作,所以您只需要:
s=$1
port="[^0-9]$s$"
netstat -numeric | awk -v pat="$port" '$6 == "ESTABLISHED" && $4 ~ pat'
你没有工作的原因是/.../
是regexp常量分隔符,如"..."
是字符串常量分隔符,因此将它们包含在动态正则表达式中就好像你包含了引号用例如foo="\"stuff\""
代替foo="stuff"
," /" s成为正则表达式的一部分,而不是正则表达式的分隔符。