web-dev-qa-db-fra.com

Conversion d'une plage d'adresses IPv4 en masques de réseau à l'aide de bash

J'ai un fichier d'entrée avec des adresses IPv4:

94.228.16.0 - 94.228.25.255
94.241.136.0/24
94.241.136.0 - 94.241.136.255
94.29.128.0/17
94.29.128.0 - 94.29.191.0
94.29.192.0 - 94.29.255.0
94.74.181.0/24
94.74.181.0 - 94.74.181.31
94.74.181.128 - 94.74.181.255

Comment puis-je convertir les plages d'adresses en masques de réseau? Le résultat devrait être:

94.228.16.0/21
94.241.136.0/24
94.241.136.0/24
94.29.128.0/17
94.29.128.0/19
94.29.192.0/19
94.74.181.0/24
94.74.181.0/27
94.74.181.128/25
10
Oleksii

Vous devez d’abord installer un paquet pour faire la conversion

Sudo apt install ipcalc

Maintenant, vous pouvez le faire avec ce petit script (veuillez noter que cela ne fonctionne pas si vous citez la variable):

$ while read line; do if [[ $line = *-* ]]; then (ipcalc $line | sed '2!d'); else echo $line; fi; done < file
94.228.16.0/21
94.241.136.0/24
94.241.136.0/24
94.29.128.0/17
94.29.128.0/19
94.29.192.0/19
94.74.181.0/24
94.74.181.0/27
94.74.181.128/25

ou plus lisiblement

while read line; do
   if [[ $line = *-* ]]; then 
     (ipcalc $line | sed '2!d')
   else echo $line
   fi
done < file
14
Zanna

Sans surprise, il existe un module CPAN Perl Net :: CIDR pour cela.

Donc par exemple:

$ Perl -MNet::CIDR=range2cidr -lne 'print for range2cidr $_' yourfile
94.228.16.0/21
94.228.24.0/23
94.241.136.0/24
94.241.136.0/24
94.29.128.0/17
94.29.191.0/32
94.29.128.0/19
94.29.160.0/20
94.29.176.0/21
94.29.184.0/22
94.29.188.0/23
94.29.190.0/24
94.29.255.0/32
94.29.192.0/19
94.29.224.0/20
94.29.240.0/21
94.29.248.0/22
94.29.252.0/23
94.29.254.0/24
94.74.181.0/24
94.74.181.0/27
94.74.181.128/25

Le module est disponible sur Ubuntu en installant le paquetage libnet-cidr-Perl.

NB J'ai pas validé votre saisie ou les résultats.

3
steeldriver