2016-12-15 122 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」'),但這會使正則表達式成爲一個動態正則表達式。 –