我需要计算子网,在Solaris机器shell中有一个IP地址和网络掩码(bash,但可能是其他的)。
一些例子:
IP=192.168.100.6, MASK=255.255.255.0 => SUBNET=192.168.100.0
IP=11.95.189.33, MASK=255.255.0.0 => SUBNET=11.95.0.0
IP=66.25.144.216, MASK=255.255.255.192 => SUBNET=66.25.144.192
我有两种计算方法:
SUBNET=$((`echo $IP | awk 'BEGIN { FS = "." } ; {print $1}'`&`echo $MASK | awk 'BEGIN { FS = "." } ; {print $1}'`)).\
$((`echo $IP | awk 'BEGIN { FS = "." } ; {print $2}'`&`echo $MASK | awk 'BEGIN { FS = "." } ; {print $2}'`)).\
$((`echo $IP | awk 'BEGIN { FS = "." } ; {print $3}'`&`echo $MASK | awk 'BEGIN { FS = "." } ; {print $3}'`)).\
$((`echo $IP | awk 'BEGIN { FS = "." } ; {print $4}'`&`echo $MASK | awk 'BEGIN { FS = "." } ; {print $4}'`))
和
l="${IP%.*}";r="${IP#*.}";n="${MASK%.*}";m="${MASK#*.}"
subnet=$((${IP%%.*}&${NM%%.*})).$((${r%%.*}&${m%%.*})).$((${l##*.}&${n##*.})).$((${IP##*.}&${NM##*.}))
但我认为它们都有点“肮脏”。我想用一种“更干净”的方式来计算子网,我项目中的其他人也很容易理解。
我不想使用 perl 或 python ,但可以考虑使用。
答案 0 :(得分:1)
假设您将ip和mask存储到两个shell变量中:$ip
和$mask
:
awk -vip="$ip" -vmask="$mask" 'BEGIN{
split(ip,a, ".");
split(mask,b,".");
for(i=1;i<=4;i++)a[i]=b[i]==255?a[i]:b[i];
printf"SUBNET=";for(i=1;i<=3;i++)printf a[i]".";printf a[4]}'
会以格式显示结果:SUBNET=xxx.xxx.xxx.xxx
举个例子:
kent$ ip="192.168.100.6"
kent$ mask="255.255.255.192"
kent$ awk -vip="$ip" -vmask="$mask" 'BEGIN{split(ip,a, "."); split(mask,b,".");for(i=1;i<=4;i++)a[i]=b[i]==255?a[i]:b[i]; printf"SUBNET=";for(i=1;i<=3;i++)printf a[i]".";printf a[4]}'
SUBNET=192.168.100.192
答案 1 :(得分:1)
我的解决方案可以完成实际需要完成的工作。 Ip和面具是'和'在一起。这就是我用过的。
假设,这里$ ip和$ mask是定义的shell变量。
awk -vip="$ip" -vmask="$mask" 'BEGIN{
sub("addr:","",ip);
sub("Mask:","",mask);
split(ip,a,".");
split(mask,b,".");
for(i=1;i<=4;i++)
s[i]=and(a[i],b[i]);
subnet=s[1]"."s[2]"."s[3]"."s[4];
print subnet;
}'
压缩:
awk -vip="$ip" -vmask="$mask" 'BEGIN{sub("addr:","",ip);sub("Mask:","",mask);split(ip,a,".");split(mask,b,".");for(i=1;i<=4;i++)s[i]=and(a[i],b[i]);subnet=s[1]"."s[2]"."s[3]"."s[4];print subnet;}'
类似于肯特给出的例子。
示例:
[rahul]$ ip=172.16.232.159
[rahul]$ mask=255.255.254.0
[rahul]$ awk -vip="$ip" -vmask="$mask" 'BEGIN{sub("addr:","",ip);sub("Mask:","",mask);split(ip,a,".");split(mask,b,".");for(i=1;i<=4;i++)s[i]=and(a[i],b[i]);subnet=s[1]"."s[2]"."s[3]"."s[4];print subnet;}'
172.16.232.0