2013-03-07 2 views
1

Я работаю над скриптом, который выполняет подсети. До сих пор, это выглядит следующим образом (в части):Сценарий Bash, разбор двоичного числа от obase до строки?

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 в строку, чтобы я мог их сосчитать.

Любые предложения?

+1

пример не завершена, так что трудно сказать совсем то, что происходит здесь. – danfuzz

ответ

0

Отделить октета Я хотел бы использовать printf и paste вместо этого, например:

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

Или, если ф является одной переменной:

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

Выход:

00001010.00101010.01100110.11111100 

Чтобы подсчитать количество 1s в сетевой маске, просто добавьте их:

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

Выход:

30 
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 

А затем извлечь то, что мне было нужно. Выполняется MUCH быстрее, чем парсинг несколько раз через '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-значный двоичный выходной формат, который вы хотите.

+0

Обратите внимание: во избежание получения точки в конце вам нужно будет сделать некоторое отслеживание в awk. –

0

Два быстрых решений:

$ 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')' 
Смежные вопросы