Bash - 以 CIDR 表示法转换网络掩码?
Bash - Convert netmask in CIDR notation?
示例:
我有这个网络掩码:255.255.255.0
在 bash 中是否有一个命令或一个简单的脚本来转换我的网络掩码的表示法
/24?
RHEL6/RHEL7 的示例函数:
IPprefix_by_netmask() {
#function returns prefix for given netmask in arg1
ipcalc -p 1.1.1.1 | sed -n 's/^PREFIX=\(.*\)/\//p'
}
结果:
$ IPprefix_by_netmask 255.255.255.0
/24
在其他 Linux 发行版中,ipcalc 选项可能不同。
没有 ipcalc 的相同功能,在 Solaris 和 Linux 中测试:
IPprefix_by_netmask() {
#function returns prefix for given netmask in arg1
bits=0
for octet in $(echo | sed 's/\./ /g'); do
binbits=$(echo "obase=2; ibase=10; ${octet}"| bc | sed 's/0//g')
let bits+=${#binbits}
done
echo "/${bits}"
}
函数使用subnetcalc
:
IPprefix_by_netmask() {
subnetcalc 1.1.1.1 "" -n | sed -n '/^Netw/{s#.*/ #/#p;q}'
}
在纯 bash
中,将 IP 转换为长八进制字符串并对其位求和:
IPprefix_by_netmask () {
c=0 x=0$( printf '%o' ${1//./ } )
while [ $x -gt 0 ]; do
let c+=$((x%2)) 'x>>=1'
done
echo /$c ; }
IPprefix_by_netmask 255.255.255.0
(任一函数)的输出:
/24
根据 Sasha 的回答,此脚本适用于 dash
(使用 Ubuntu 18.04 测试):
IPprefix_by_netmask() {
#function returns prefix for given netmask in arg1
bits=0
for octet in $(echo | sed 's/\./ /g'); do
binbits=$(echo "obase=2; ibase=10; ${octet}"| bc | sed 's/0//g')
bits=$(expr $bits + ${#binbits})
done
echo "/${bits}"
}
基于awk的解决方案
虽然 GNU awk 不是 Bash,但它默认安装在足够多的发行版中,这在问题的意义上可能会有所帮助:
awk -F. '{
split([=10=], octets)
for (i in octets) {
mask += 8 - log(2**8 - octets[i])/log(2);
}
print "/" mask
}' <<< 255.255.255.240
这会打印:
/28
示例: 我有这个网络掩码:255.255.255.0
在 bash 中是否有一个命令或一个简单的脚本来转换我的网络掩码的表示法 /24?
RHEL6/RHEL7 的示例函数:
IPprefix_by_netmask() {
#function returns prefix for given netmask in arg1
ipcalc -p 1.1.1.1 | sed -n 's/^PREFIX=\(.*\)/\//p'
}
结果:
$ IPprefix_by_netmask 255.255.255.0
/24
在其他 Linux 发行版中,ipcalc 选项可能不同。
没有 ipcalc 的相同功能,在 Solaris 和 Linux 中测试:
IPprefix_by_netmask() {
#function returns prefix for given netmask in arg1
bits=0
for octet in $(echo | sed 's/\./ /g'); do
binbits=$(echo "obase=2; ibase=10; ${octet}"| bc | sed 's/0//g')
let bits+=${#binbits}
done
echo "/${bits}"
}
函数使用
subnetcalc
:IPprefix_by_netmask() { subnetcalc 1.1.1.1 "" -n | sed -n '/^Netw/{s#.*/ #/#p;q}' }
在纯
bash
中,将 IP 转换为长八进制字符串并对其位求和:IPprefix_by_netmask () { c=0 x=0$( printf '%o' ${1//./ } ) while [ $x -gt 0 ]; do let c+=$((x%2)) 'x>>=1' done echo /$c ; }
IPprefix_by_netmask 255.255.255.0
(任一函数)的输出:
/24
根据 Sasha 的回答,此脚本适用于 dash
(使用 Ubuntu 18.04 测试):
IPprefix_by_netmask() {
#function returns prefix for given netmask in arg1
bits=0
for octet in $(echo | sed 's/\./ /g'); do
binbits=$(echo "obase=2; ibase=10; ${octet}"| bc | sed 's/0//g')
bits=$(expr $bits + ${#binbits})
done
echo "/${bits}"
}
基于awk的解决方案
虽然 GNU awk 不是 Bash,但它默认安装在足够多的发行版中,这在问题的意义上可能会有所帮助:
awk -F. '{
split([=10=], octets)
for (i in octets) {
mask += 8 - log(2**8 - octets[i])/log(2);
}
print "/" mask
}' <<< 255.255.255.240
这会打印:
/28