2016-03-19 10 views
2

次の行のIPアドレス(86.23.215.130)はどのように印刷できますか?ファイル全体(図示せず)はwget(つまりHTML)の標準出力です。簡単に聞こえますが、私は管理しませんでした。HTML文書からIPアドレスを抽出する

... 
<tr><td align=center colspan=3 bgcolor="D0D0D0"><font face="Arial, Monospace" size=+3>86.23.215.130</font></td></tr> 
... 

おかげ

+0

注:、一部の属性はHTML5では時代遅れです。 https://www.w3.org/TR/html5/obsolete.html#non-conforming-features – Rob

答えて

2

IPアドレスが3つの周期ポイントによって分離0~3桁の四つのグ​​ループです。

sed -e '/[0-9]\.[0-9]\.[0-9]\.[0-9]/p' infile.txt 
+0

'[0-9]'は '[0-9] +'でなければなりません。 – Siguza

+0

はい、そうです、私の場合は1桁しか見つかりません。 –

+0

Nope。 '+'を指定しても、infile.txt全体が返されます。 – geohei

4

なぜsedですか?

の\ Spark Proのは意味
grep -iohP '(?<=\x3e)([0-9]+\.){3}[0-9]+(?=\x3c)' file 

>と\ X3Cは<(ASCII 16進コード)を意味

SEDはこれを行うことができますが、それはお勧めできません:私はgrepのがはるかに優れていると信じてい

sed -rn 's/.*\x3e(([0-9]+\.){3}[0-9]+)\x3c.*/\1/p' file 

Sternadさんのおかげで、私は少しこれを改善しました。

+0

うわー... grepとsedコードはどちらも完璧に動作します。しかし、それは理解するのに長い時間がかかります。どうもありがとう !!! – geohei

3

だけIPアドレスを抽出したい場合は、次のコマンドを使用する必要があります。ここでは

sed -E -n 's/.*>([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)<.*/\1/p' file.txt 

は、それが何をするかです:拡張正規表現モードにsedの

  • -Eスイッチが(-r
  • -nは、一致する行の出力を抑止します。
  • 's/something/something2/p'は、sometと置き換えられます得られた一致
  • ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)はドット
  • \ 1で区切られた4つの連続する数字のグループは、この正規表現は、必ずしも正しいIPを見つけられないこと

注上記捕捉グループへの参照で捕捉hing2と印刷アドレスではなく、ドットで区切られた数字の任意のシーケンス。

さらに柔軟性(精度)が必要な場合は、Perl Commons Regex moduleを使用できます。 IPアドレスを検証します。あなたは正しく表現を固定する必要が

perl -MRegexp::Common -lne 'print $1 if /($RE{net}{IPv4})/' file.txt 

注意、486.23.215.130のようなそうでない場合は、無効なIPは、86.23.215.130の有効なアドレスに削減されます。

+0

ありがとうございます。私はpがsの尾として使用できることを知らなかった。私の場合でも、単純なバージョンは欲張りモードに遭遇し、ipの最初の '8'を失う。 – POW

+0

@POW修正、ありがとう –

+0

ソリューションと説明をありがとう! IPv4アドレスを検証する別のコードがあります。終了したら結果を投稿します。 – geohei

0

ここはどうですか? 備考私が知っている

grep "size=+3" | awk -F'[<>]' '{print $7}' 

...それはIPがsize+3を含む行の同じ場所に常にあることを前提としています。あなたの提案はもっと一般的に定式化されているため、任意の解析入力テキストに適しています。

関連する問題