通过bash shell脚本传递动态regexp

时间:2016-12-15 15:11:09

标签: bash shell awk gawk

我正在编写一个简单的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

任何建议都会非常感激。

1 个答案:

答案 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成为正则表达式的一部分,而不是正则表达式的分隔符。