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
最初に、変換を行うためにパッケージをインストールする必要があります
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
おそらく驚くことではないが、このための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で利用できます。
NB私はnot入力または結果を検証しました。