使用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

@Zanna你在作弊,海报使用bash询问。我的bash没有ipcalc内置函数。;-)
zwets

@zwets啊,我知道了!但是你是对的,炮弹需要很多帮助哈哈哈
Zanna

Answers:


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上使用。

注意:尚未验证您的输入或结果。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.