2016-12-15 9 views
0

IPポートをregexpにawkコマンドに渡すための簡単なbashスクリプトをコーディングしています。私はここでのみローカルの宛先にポート用bashシェルスクリプトを使って動的正規表現を渡す

を探していますコードです:ここでは

#!/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"とすると、 "/"は正規表現の区切り記号の代わりに正規表現の一部になります。

+0

したがって、/.../が暗示されます。助けのためのthx – Drewber49er

+0

いいえ、彼らは暗黙のうちに、私が再び言ったことを読んでいない。 '/.../'は**一定の正規表現**の区切り文字です。あなたは動的正規表現を使用している定数正規表現を使用しておらず、変数内の文字列として正規表現を保存しています。文字列内で '/'は単なるリテラル '/'文字です。 '/ foo /'で '/'は正規表現の一部ではなく、正規表現の周りの区切り文字で正規表現の定数として定義します。代わりに '' 'デリミタを使うことができます(' $ 0〜 "foo" ')が、正規表現を動的正規表現にします。 –

関連する問題