在Solaris shell中计算子网

在Solaris shell中计算子网,shell,awk,netmask,Shell,Awk,Netmask,我需要计算子网,在Solaris机器外壳中有一个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 我有两种计算方法

我需要计算子网,在Solaris机器外壳中有一个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}'`))

但我觉得他们两个都有点“脏”。我想一个“清洁”的方式来计算子网,易于理解的其他人在我的项目


我不喜欢使用perl或python,但可以考虑。

假设您将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]}'

我的解决方案做了实际需要做的事情。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””开始{
子(“地址:,”,ip);
子(“掩码:,”,掩码);
拆分(ip,a,“.”);
拆分(掩码,b,“.”);

对于(i=1;仅当ip位于主网络的第一个子网时,它才起作用。例如,对于ip=“10.0.0.99”vmask=“255.255.255.196”@Kveri,它不起作用。您希望得到什么结果?对不起,我的意思是vip=“10.0.0.99”和vmask=“255.255.192”。代码给出的结果是SUBNET=10.0.0.192。正确的结果是10.0.0。64@Kveri你可以对答案投反对票,很好。但OP在问题中写道:
IP=66.25.144.216,MASK=255.255.255.192=>SUBNET=66.25.144.192
他还给出了他的代码(算法).我只是根据我对问题和他的代码的理解给出了答案。请阅读问题。@Kveri我对你的否决票并不不满,我说,“很好”。SO网站用于解决特定问题,如果问题对其他人有帮助,那么很好。如果没有,也可以。如果你认为你有更好的想法,请发布你的答案。我不是在与你争论。我喜欢这个网站,但你似乎在使用我有3次错误的“函数和从未定义”
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  
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