Konvertieren eines Bereichs von IPv4-Adressen in Netmasken mithilfe von Bash

10

Ich habe eine Eingabedatei mit IPv4-Adressen:

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

Wie kann ich die Adressbereiche in Netzmasken konvertieren? Das Ergebnis sollte sein:

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
Oleksii
quelle
3
Einige der von Ihnen angeforderten Ergebnisse sind falsch, sodass kein gültiges Bash-Skript sie erzeugt. Zum Beispiel ist der erste Bereich mit einer Netzmaske nicht ausdrückbar: 94.228.16.0/21 ergibt 94.228.16.0 - 94.228.23.255, und der nächst breitere 94.228.16.0/20 ergibt 94.228.16.0 - 94.228.31.255. Bereiche, die mit .0 enden, können von keiner Netzmaske erzeugt werden.
zwets
@Zanna du betrügst, fragte das Plakat mit Bash . Meine Bash hat keine ipcalceingebauten. ;-)
zwets
@zwets ah Ich habe es herausgefunden! Aber du hast recht, die Shell braucht viel Hilfe, hahaha
Zanna

Antworten:

14

Zuerst müssen Sie ein Paket installieren, um die Konvertierung durchzuführen

sudo apt install ipcalc

Jetzt können Sie es mit diesem kleinen Skript tun (bitte beachten Sie, dass es nicht funktioniert, wenn Sie die Variable zitieren):

$ 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

oder besser lesbar

while read line; do
   if [[ $line = *-* ]]; then 
     (ipcalc $line | sed '2!d')
   else echo $line
   fi
done < file
Zanna
quelle
@Oleksii immer ein Vergnügen :)
Zanna
3

Vielleicht nicht überraschend, gibt es dafür ein CPAN-Perl-Modul Net :: CIDR .

Also zum Beispiel:

$ 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

Das Modul ist unter Ubuntu verfügbar, indem das libnet-cidr-perlPaket installiert wird .

NB Ich habe Ihre Eingabe oder die Ergebnisse nicht validiert.

Steeldriver
quelle