как я могу преобразовать общее количество хостов в сети в маску?
например, 1024
в /22
ip calc
может сделать обратное
$ ipcalc 89.150.4.0/22
Address: 89.150.4.0 01011001.10010110.000001 00.00000000
Netmask: 255.255.252.0 = 22 11111111.11111111.111111 00.00000000
Wildcard: 0.0.3.255 00000000.00000000.000000 11.11111111
=>
Network: 89.150.4.0/22 01011001.10010110.000001 00.00000000
HostMin: 89.150.4.1 01011001.10010110.000001 00.00000001
HostMax: 89.150.7.254 01011001.10010110.000001 11.11111110
Broadcast: 89.150.7.255 01011001.10010110.000001 11.11111111
Hosts/Net: 1022 Class A
справочная информация:
У меня есть текстовый файл с таким содержанием, как
AD|85.94.160.0|8192
AD|89.150.2.0|512
AD|89.150.4.0|1024
AD|89.150.8.0|2048
, и мне нужно преобразовать 3-й столбец (общее количество хостов) в сетевая маска
, если это невозможно с использованием инструментов оболочки, я не против передать его в python / perl / ruby скрипт
EDIT
очень краткий ответ и комментарии от @KamilCuk помогли мне понять лог c, стоящий за ним.
Я даже не использую ipcalc
для этого больше :)
ОТВЕТ
от hosts
до mask
$: HOSTS=1024
$: LC_NUMERIC=C printf "%.0f" $(bc -l <<< "32-(l($HOSTS)/l(2))")
22
или
$: HOSTS=1024
$: echo | awk -v HOSTS=$HOSTS '{print int(32-(log(HOSTS)/log(2)))}'
22
и от mask
до hosts
$: MASK=22
$: echo "2^(32-$MASK)" | bc
1024
или
$: MASK=22
$: echo | awk -v MASK=$MASK '{print 2^(32-MASK)}'
1024