使用 bash 将一系列 IPv4 地址转换为网络掩码

Ole*_*sii 10 command-line bash networking

我有一个带有 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
Run Code Online (Sandbox Code Playgroud)

如何将地址范围转换为网络掩码?结果应该是:

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
Run Code Online (Sandbox Code Playgroud)

Zan*_*nna 14

首先,您需要安装一个包来进行转换

sudo apt install ipcalc
Run Code Online (Sandbox Code Playgroud)

现在你可以用这个小脚本来完成(请注意,如果你引用变量,它就不起作用):

$ 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
Run Code Online (Sandbox Code Playgroud)

或更易读

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