bashを使用してIPv4アドレスの範囲をネットマスクに変換する


10

IPv4アドレスを含む入力ファイルがあります。

94.228.16.0 - 94.228.25.255
94.241.136.0/24
94.241.136.0 - 94.241.136.255
94.29.128.0/17
94.29.128.0 - 94.29.191.0
94.29.192.0 - 94.29.255.0
94.74.181.0/24
94.74.181.0 - 94.74.181.31
94.74.181.128 - 94.74.181.255

アドレス範囲をネットマスクに変換するにはどうすればよいですか?結果は次のようになります。

94.228.16.0/21
94.241.136.0/24
94.241.136.0/24
94.29.128.0/17
94.29.128.0/19
94.29.192.0/19
94.74.181.0/24
94.74.181.0/27
94.74.181.128/25

3
要求した結果のいくつかは不正確であるため、有効なbashスクリプトはそれらを生成しません。たとえば、最初の範囲はネットマスクを使用して表現できません。94.228.16.0/ 21は94.228.16.0-94.228.23.255を示し、次に広い94.228.16.0/20は94.228.16.0-94.228.31.255を示します。また、末尾が.0の範囲は、どのネットマスクでも作成できません。
zwets 2017年

@Zannaあなたがごまかしている、ポスターはbashを使って尋ねました。私のbashにはビルトインがありませんipcalc。;-)
zwets 2017年

@zwetsああ、私はそれを理解しました!しかし、あなたは正しいです、シェルにはハハハの多くの助けが必要です
Zanna

回答:


14

まず、変換を行うためにパッケージをインストールする必要があります

sudo apt install ipcalc

これで、この小さなスクリプトでそれを行うことができます(変数を引用符で囲んだ場合は機能しないことに注意してください):

$ while read line; do if [[ $line = *-* ]]; then (ipcalc $line | sed '2!d'); else echo $line; fi; done < file
94.228.16.0/21
94.241.136.0/24
94.241.136.0/24
94.29.128.0/17
94.29.128.0/19
94.29.192.0/19
94.74.181.0/24
94.74.181.0/27
94.74.181.128/25

より読みやすく

while read line; do
   if [[ $line = *-* ]]; then 
     (ipcalc $line | sed '2!d')
   else echo $line
   fi
done < file

@Oleksiiは常に喜びです:)
Zanna

3

おそらく驚くことではないでしょうが、これにはCPAN perlモジュールNet :: CIDRがあります。

だから例えば:

$ perl -MNet::CIDR=range2cidr -lne 'print for range2cidr $_' yourfile
94.228.16.0/21
94.228.24.0/23
94.241.136.0/24
94.241.136.0/24
94.29.128.0/17
94.29.191.0/32
94.29.128.0/19
94.29.160.0/20
94.29.176.0/21
94.29.184.0/22
94.29.188.0/23
94.29.190.0/24
94.29.255.0/32
94.29.192.0/19
94.29.224.0/20
94.29.240.0/21
94.29.248.0/22
94.29.252.0/23
94.29.254.0/24
94.74.181.0/24
94.74.181.0/27
94.74.181.128/25

このモジュールは、libnet-cidr-perlパッケージをインストールすることでUbuntuで使用できます。

注:入力または結果を検証しいません

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.