RHEL6/RHEL7 的示例函数:
IPprefix_by_netmask() {
#function returns prefix for given netmask in arg1
ipcalc -p 1.1.1.1 $1 | sed -n 's/^PREFIX=\(.*\)/\/\1/p'
}
Run Code Online (Sandbox Code Playgroud)
结果:
$ IPprefix_by_netmask 255.255.255.0
/24
Run Code Online (Sandbox Code Playgroud)
在其他 Linux 发行版中,ipcalc 选项可能有所不同。
没有 ipcalc 的相同功能,在 Solaris 和 Linux 中测试:
IPprefix_by_netmask() {
#function returns prefix for given netmask in arg1
bits=0
for octet in $(echo $1| sed 's/\./ /g'); do
binbits=$(echo "obase=2; ibase=10; ${octet}"| bc | sed 's/0//g')
let bits+=${#binbits}
done
echo "/${bits}"
}
Run Code Online (Sandbox Code Playgroud)
功能使用subnetcalc:
IPprefix_by_netmask() {
subnetcalc 1.1.1.1 "$1" -n | sed -n '/^Netw/{s#.*/ #/#p;q}'
}
Run Code Online (Sandbox Code Playgroud)在 pure 中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 ; }
Run Code Online (Sandbox Code Playgroud)IPprefix_by_netmask 255.255.255.0(任一函数)的输出:
/24
Run Code Online (Sandbox Code Playgroud)
虽然GNU awk不是 Bash,但它在足够多的发行版中默认安装了它\xe2\x80\x99,这对于问题的意义可能会有所帮助:
\nawk -F. '{\n split($0, octets)\n for (i in octets) {\n mask += 8 - log(2**8 - octets[i])/log(2);\n }\n print "/" mask\n}' <<< 255.255.255.240\nRun Code Online (Sandbox Code Playgroud)\n这打印:
\n/28\nRun Code Online (Sandbox Code Playgroud)\n