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

これを計算するには、次の 2 つの方法があります。

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とmaskを2つのシェル変数に格納するとし$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 に答える