1

サブネット計算を行うスクリプトに取り組んでいます。これまでのところ、次のようになっています (部分的に)。

echo "Subnet Address  : "$sn1.$sn2.$sn3.$sn4
echo "BCast Address   : "$br1.$br2.$br3.$br4
echo -e "\nSubnet address in binary" :
echo "obase=2;$ip1"+"obase=2;$ip2"+"obase=2;$ip3"+"obase=2;$ip4" \
  | bc | awk '{printf("%08d",$ip1)}'
echo -e "\nBroadcast address in binary" :
echo "obase=2;$br1"+"obase=2;$br2"+"obase=2;$br3"+"obase=2;$br4" \
  | bc | awk '{printf("%08d",$br1)}'

これにより、次の出力が得られます。

Subnet address in binary :
11000010101010100000001100000000
Broadcast address in binary :
11000010101010100000001100011111
  1. オクテットを分離しよう'{printf("%08d.",$br1)}''{printf(".%08d",$br1)}'しましたが、最初または最後に余分なドットが表示されます。
  2. echo "obase=2;$br1"+"obase=2;$br2"+"obase=2;$br3"+"obase=2;$br4"| bc | awkネットマスクにあるエースの数を計算したいのですが、それらをカウントできるように、の出力を文字列に取得する方法が本当に見つかりません。

助言がありますか?

4

3 に答える 3

2

出力を 01111111.00000000.00000000.00000001 の形式にしたいですか?

さて、これに頭を悩ませたときに使用したチート方法は、ipcalc をラップすることでした。

%ipcalc 127.0.0.1
Address:   127.0.0.1            01111111.00000000.00000000. 00000001
Netmask:   255.255.255.0 = 24   11111111.11111111.11111111. 00000000
Wildcard:  0.0.0.255            00000000.00000000.00000000. 11111111
=>
Network:   127.0.0.0/24         01111111.00000000.00000000. 00000000
HostMin:   127.0.0.1            01111111.00000000.00000000. 00000001
HostMax:   127.0.0.254          01111111.00000000.00000000. 11111110
Broadcast: 127.0.0.255          01111111.00000000.00000000. 11111111
Hosts/Net: 254                   Class A, Loopback

そして、必要なものを抽出します。「bc」を介して複数回解析するよりもはるかに高速に実行されます。つまり、必要がなければ車輪を再発明しても意味がありません。

車輪を少し再発明したい場合:

$ echo "obase=2;200" + "obase=2;150" + "obase=2;200" + "obase=2;150" | \
   bc | awk '{printf "%08d\." ,$1}' | \
   sed -e 's/[.]*$//'
11001010.10011000.11001010.10010110

これにより、必要な 8 桁のバイナリ出力形式が得られます。

于 2013-03-07T19:16:54.680 に答える
0

2つの簡単な解決策:

$ echo $br1.$br2.$br3.$br4 |  
    perl -F\\\. -anE 'say join ".", map { sprintf "%08b", $_ } @F'
$ perl -e 'printf( "%08b.%08b.%08b.%08b\n", '$br1,$br2,$br3,$br4')'
于 2013-03-08T10:40:06.420 に答える
0

オクテットを分離するにはprintfpaste代わりに次のように使用します。

ip1=127; ip2=0; ip3=0; ip4=1
printf "%08d\n" $(bc <<<"obase=2; $ip1; $ip2; $ip3; $ip4") | paste -sd.

または、IPが1つの変数に含まれている場合:

ip=127.0.0.1
printf "%08d\n" $(bc <<<"obase=2; ${ip//./;}") | paste -sd.

出力:

00001010.00101010.01100110.11111100

ネットマスクの1の数を数えるには、それらを追加するだけです。

netmask=255.255.255.252
printf "%08d" $(bc <<<"obase=2; ${netmask//./;}") | grep -o . | paste -sd+ | bc

出力:

30
于 2013-03-07T19:51:47.767 に答える