2011-02-24 6 views
1

私の正規表現をCentOS 5.5上で動作するsedコマンドに変換するのに本当に問題があります。regexとsedを使用してIPをフィルタリングします

私は、文字列のうち、IPアドレスをフィルタリングする:

"example.org has address 123.45.67.890" -> "123.45.67.890" 

私の正規表現は、これまでのところです:

/([a-zA-Z\. ]+)([0-9\.]+)/ 

そして、SEDを使用して、私のコマンドの例は次のとおりです。

host example.org | grep 'has address' | sed 's/\([a-zA-Z\\. ]+\)\([0-9\\.]+\)/\2/' 

しかし、私はそのコマンドから戻ってくるすべてがsedへの入力です: "example.orgにはアドレス123.45.67.890があります"

アイデア?

+0

このshoudlはunix **ユーザー**サイトにあります。プログラミングサイトではありません。 –

答えて

4
host example.org | awk '/has address/ {print $4 }' 
1

これには実際にはsedは必要ありません。あなたは、スペースを解析する代わりにcutを使用することもできます。

host example.org | grep 'has address' | cut -d' ' -f4 

これはちょうどスペースで区切られた4番目の単語を取ります。

0

([a-zA-Z\. ]+)は、IPアドレスの前のすべてを取得し、一致するものを含めます。また、ドメイン名に数字が含まれていると、照合が失敗します。見て回りを使う:

/(?<has address)\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/ 

あなたは明らかにneed to use Perl mode for sed to support lookbehindsです。キャプチャグループを使用することもできます。あなたはより多くの識別パターン(すなわち唯一のIPアドレスのように非常に強く見えるものと一致)したい場合、あなたはこれを試すことができます。

ドットで区切らとが先行し、0〜255の4つの数字と一致している必要があり
/(?<has address)(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\b/ 

'アドレスを持つ'。 |

host example.org | grep -Po '.*has address \K[0-9.]*' 
+0

Perlモード'ssed'と呼ばれるカスタマイズされた' sed'のバージョンに適用されます。 –

2

は、ここで正規表現せずにそれを行うための非常に簡単な方法ですsedが標準のコマンドラインツールであるので、sed -n 's /^.*(。*)$/\ 1/p'

0

GNU grepを使用する:

0

ホストexmaple.org:

host example.org | grep "has addres" | awk '{print $4}' 
関連する問題