1

我需要计算子网,在 Solaris 机器外壳(bash,但可能是其他的)中具有 IP 地址和网络掩码。

一些例子:

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##*.}))

但我觉得他们俩都有点“脏”。我想要一种“更干净”的方式来计算子网,我的项目中的其他人很容易理解。

我不喜欢使用perlpython,但可以考虑。

4

2 回答 2

1

假设您将 ip 和掩码存储到两个 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  
于 2013-03-06T13:00:41.440 回答
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;}'

与 kent 给出的示例类似。

例子:

[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
于 2014-01-14T11:02:22.633 回答