Haeufig kommt es vor, dass man eine Liste von IP-Adressen sortieren muss.
Dabei ist es hilfreich, sich zu vergegenwaertigen, dass IPs (bei IPv4) aus 4 Bytes bestehen. Also kann man jede IP auch durch eine Zahl darstellen. Wenn 5.6.7.8
die IP-Adresse ist, kann man sie auch in dieser Form schreiben 5*256*256*256 + 6*256*256 + 7*256 + 8
, mit anderer Klammerung ergibt sich (((5*256 + 6)*256 + 7)*256 + 8)
oder auch 84281096
.
Zureck zur IP geht es mit ganzzahliger Division und Restwertberechnung:
$ bc 84281096 % 256 8 84281096 / 256 329223 329223 % 256 7 329223 / 256 1286 1286 % 256 6 1286 / 256 5
Darum sollte es aber gar nicht gehen Dieses kleine Perl-Skript nimmt eine Liste von IP-Adresse vom Standard-Eingabekanal STDIN und gibt die Liste sortiert an STDOUT (Standardausgabekanal) aus:
#!/usr/bin/perl use warnings; use strict; sub ip_vergleich { my @ip1 = split /\./,$a ; my @ip2 = split /\./,$b ; my $i1 = (($ip1[0]*256 + $ip1[1])*256 + $ip1[2])*256 + $ip1[3]; my $i2 = (($ip2[0]*256 + $ip2[1])*256 + $ip2[2])*256 + $ip2[3]; return $i1 <=> $i2; } my @sorted = sort ip_vergleich (<STDIN>); map { print } @sorted;
Fragen? Fragen!