WebリストからIPを抽出する

WebリストからIPを抽出する

テキスト、IPv4、IPv6 IP、改行、IP範囲などが混在している巨大なネットワーク生成リストからIPを抽出しようとしています。

以下はリストの一部です。

; Spamhaus DROP List 2016/07/03 - (c) 2016 The Spamhaus Project
; http://www.spamhaus.org/drop/drop.txt
; Last-Modified: Sun,  3 Jul 2016 21:18:32 GMT
; Expires: Sun, 03 Jul 2016 23:26:45 GMT

1.0.1.0/24
223.223.176.0
129.130.100.100
1.160.118.30
91.121.120.228 # 2016-07-05, ns350944.ip-91-121-120.eu, FRA, 1                        
62.210.111.59 # 2016-07-05, sender9p2.offresduweb.fr, FRA, 1                            
52.90.253.169 # 2016-07-05, ec2-52-90-253-169.compute-1.amazonaws.com, USA, 13                  
2a01:4f8:200:2153::2 # 2016-06-27, 2a01:4f8:200:2153::2, DEU, 2                                
2601:1c1:8801:618c:9864:3f33:7569:38c4  # 2016-06-28, 2601:1c1:8801:618c:9864:3f33:7569:38c4, USA, 2
#last updated 2016.07.04 1733 UTC

1.0.1.0/24  China
1.0.2.0/23  China
1.0.8.0/21  China
1.0.32.0/19  China
1.1.0.0/24  China

より大きな部分を見るには、次を参照してください。ペーストビンしかし、実際のリストには44,000を超える行があるため、これは完全なリストではありません。

私がやりたいことは、リストから通常のIP(IPv4)のみを取得することです。

上記の内容に対する私の異議は次のとおりです。

grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'

それは私に以下を与えます:

1.0.1.0
223.223.176.0
129.130.100.100
1.160.118.3
198.55.103.144
etc
etc

今大丈夫です。ただし、「.0」(たとえば、1.0.1.0または223.223.176.0)で終わるエントリはIP範囲であり、実際のIPではないため、望ましくありません。そのため、上記のgrepの出力をawkステートメントにパイプして、0で終わるすべてのIPを削除しました。

このgrep (IPs) | awk (remove those that end in 0)ソリューションはうまくいきますが、これを実行して複数のパイプラインgrep(またはsed / awk)の使用を最小限に抑えるためのより良い方法があるかどうかを知りたいです。

ベストアンサー1

awkを使用してすべての操作を実行できます(もちろん、パス名を想定しています)。

#!/usr/bin/awk -f

/^[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[1-9][0-9]*$/ {
        print;
        next;
}
/^[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[1-9][0-9]*[^0-9\.:].*$/ {
        sub("[^0-9.].*$","");
        print;
}

最初のパターンはIPv4にのみ一致し(次のテキストはありません)、2番目のパターンは他のテキスト一致を受け入れます(コロン付きの行を除く)。

ただし、スキーマは次のように固定する必要があります。"^"そして"$"不要な試合をスキップしてください。

これはスクリプトとして表示され、他のコマンド(grepを含むパイプなど)のように実行できます。

./foo <foo.in

与えられた

129.130.100.100
1.160.118.30
91.121.120.228
62.210.111.59
52.90.253.169

IPアドレスの後ろに迷子になったテキスト処理を簡素化するために、一致を2つの式に分割しました。この範囲は、[^0-9:\.:]少なくとも1つの失われた文字を処理する必要があることを保証します。

awkプログラムはスクリプトである必要はありませんが、自由形式でなければなりません(単一のコマンド文字列を作成すると改行を削除できます)。しかし、一行の結果は読みにくい。

-ooptionsgrep -Eまたは-Eoptionsの使用提案とは異なり、sedこのawkソリューションはすべてのPOSIXシステムで機能します。

参考用(POSIX):

おすすめ記事