文字列の間と次のスペースの前のすべてを一致させる方法

文字列の間と次のスペースの前のすべてを一致させる方法

次の文字列があるとしましょう。

sdffsd sfdfi -ip 192.168.1.1 sdfdf ertret 

「192.168.1.1」または他の有効なIPアドレス(それぞれ0から255までの点で区切られた4つの10進数、例えば172.16.254.1)を抽出したいと思います。

最も簡単な方法は、文字列 "-ip"の間と次のスペース(192.168.1.1とsdfdfの間のスペース)の間のすべてのエントリを一致させるようです。

私は試した:

sed -e 's/-s \(.*\)[[:space:]]/\1/'

しかし役に立たない

答え1

現在、あなたの質問は「文字列 '-ip'から次のスペースに抽出する方法」です。次のコマンドはこの質問に答えます。

sed -e 's/^.*-ip \([^ ]*\) .*$/\1/'

仕組みは基本的に「空白以外の文字数」です。[^ ]*

$ echo "sdf sfdi -ip 192.168.1.1 sdf eret" | sed -e 's/^.*-ip \([^ ]*\) .*$/\1/' 192.168.1.1

答え2

GNUを仮定するとgrep

$ echo 'sdffsd sfdfi -ip 192.168.1.1 sdfdf ertret' | grep -oE '[0-9.]+'
192.168.1.1

有効なIPアドレスのみに制限して、文字列を4つの数字のセットに分けます。どちらも255を超えません(最初は一致するものがないため.処理しません)。<0-

$ echo 'sdffsd sfdfi -ip 192.168.1.1 sdfdf ertret' | grep -oE '[0-9.]+' | 
    awk -F. '{for(i=1;i<=NF;i++){if(NF!=4||$i>255){next}}}1;'
192.168.1.1

答え3

GNU grepを使用してください:

echo 'sdffsd sfdfi -ip 192.168.1.1 sdfdf ertret' | grep -oE "([0-9]{1,3}[\.]){3}[0-9]{1,3}"

出力:

192.168.1.1

答え4

忘れるsed。可能なIP(v4)アドレスを抽出する方法は次のとおりです。

egrep -o '\b([0-9][0-9]?[0-9]?\.){3}[0-9][0-9]?[0-9]?\b'

絶対に有効なIPアドレス(255より大きい数値なし)を取得するには、上記のコマンドをパイプします。

egrep -v '([3-9][0-9][0-9]|2[6-9][0-9]|25[6-9])'

関連情報