2016-12-15 114 views
0

我正在编写一个简单的bash脚本来将一个IP端口传递给一个正则表达式到一个awk命令。我在寻找港口仅在局部目的地通过bash shell脚本传递动态正则表达式

下面是代码:

#!/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 

任何建议将不胜感激。

回答

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

可以删除{print},顺便说一句,因为这是默认的动作,因此,所有你需要的是:

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

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

+0

所以/.../是隐含的。 thx的帮助 – Drewber49er

+0

不,他们不是暗示的,请阅读我所说的话。 '/.../'是用于常量正则表达式**的**分隔符。你没有使用一个常量正则表达式,你正在使用一个动态正则表达式,并且你将正则表达式作为一个字符串保存在一个变量中,而在一个字符串中'/'只是一个字面的'/'字符。在'/ foo /'中'/'不是正则表达式的一部分,它们是正则表达式的分隔符,它们将其定义为正则表达式常量。你可以使用'''分隔符('$ 0〜“foo”'),但这会使正则表达式成为一个动态正则表达式。 –