20

これは課題用なので、sedを使用するしかありません。

ファイルメッセージが与えられた場合、すべての IP アドレスを抽出して出力するにはどうすればよいですか?

初めてみた

sed -n '/((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])/p' messages

しかし、それは何も印刷しませんでした。いくつかの調査を行った後、sed は ? のような貪欲でない演算子をサポートしていないことがわかりました。と |。

私は頭を悩ませてきましたが、貪欲でないオペレーターなしでこれを行う方法は考えられません。これどうやってするの?

4

5 に答える 5

40

の方が適しています(持っている場合はsed、持っている必要がありgrepます):

grep -oE '((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])' messages

これは無修正であなた自身regexのものです(テスト済みOK)

于 2013-02-18T02:28:21.953 に答える
15

がある場合は、 ERE を使用するフラグをGNU sed追加するだけです。-r

sed -rn '/((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])/p' file

それ以外の場合は、特定の文字をエスケープする必要があります:

sed -n '/\(\(1\?[0-9][0-9]\?\|2[0-4][0-9]\|25[0-5]\)\.\)\{3\}\(1\?[0-9][0-9]\?\|2[0-4][0-9]\|25[0-5]\)/p' file

これらの文字は次のとおりです。

  • 括弧を使用したグループ: (,)
  • オカレンス中括弧: {,}
  • 「または」パイプ:|
  • 貪欲でない疑問符:?

一般的に(あなたの場合ではありませんが)、次を使用してIPアドレスを照合します。

sed -rn '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' file

または互換モードで:

sed -n '/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/p' file
于 2013-02-18T03:04:56.163 に答える
9

(拡張正規表現)を使用するsed -rか、キャプチャグループをエスケープします\

于 2013-02-18T02:33:52.380 に答える
1

あなたもそれを行うことができます:

ウィンドウズ:

ipconfig | perl -nle'/(\d+\.\d+\.\d+\.\d+)/ && print $1' | sed '2 d' | head -n1;

OSX:

ifconfig | perl -nle'/(\d+\.\d+\.\d+\.\d+)/ && print $1' | sed '1 d' | head -n1;
于 2016-02-11T11:42:29.703 に答える