как преобразовать общее количество хостов в сети в маску? - PullRequest
0 голосов
/ 18 июня 2020

как я могу преобразовать общее количество хостов в сети в маску?

например, 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

1 Ответ

1 голос
/ 19 июня 2020

Вы можете вычислить в bc или awk логарифме. Затем просто вычтите из 32.

Для вашего входного файла это будет:

awk -F'|' '{print $2"/"32 - log($3)/log(2)}'
...