有一个路由表文件,里面每一行的格式为 IP地址/CIDR子网掩码,比如
58.144.0.0/16
58.16.0.0/13
58.240.0.0/12
60.0.0.0/13
使用 sort 命令排序,默认会安装字母顺序,比如 222 开头的IP会排在 58 的前面,因为 2 < 5,即使使用 -n 参数(数字大小排序)也还是会出现 144 排在 16 前面的情况,如:
58.144.0.0/16
58.16.0.0/13
看来只好请perl帮忙了,perl的sort函数可以自定义排序算法,比较方便
对于IP地址,排序时,我们可以把它分割成4部分,然后每部分进行比较,只要出现不相等的情况,就返回大小结果,否则继续后面部分的比较。
### 排序算法
sub ipsort {
## 将IP后面的子网掩码部分去掉
(my $x = $a) =~ s/\/.*$//;
(my $y = $b) =~ s/\/.*$//;
my @a = split(/\./,$x);
my @b = split(/\./,$y);
for (my $i=0;$i<4;$i++) {
next if ($a[$i] == $b[$i]) ;
return $a[$i] <=> $b[$i];
}
}
|
完整脚本:
#!/usr/bin/perl
use strict;
if (scalar(@ARGV) != 1) {
die "\nUsage sortnet.pl \n\n";
}
my $file=shift();
if (! -e "$file") {
die "\nERR: File \"$file\" does not exist !\n\n";
}
open (FILE,"$file") || die "ERR: Cannot open file \"$file\" ! \n\n";
my @array;
while (<FILE>) {
push @array, $_;
}
close (FILE);
sub ipsort {
(my $x = $a) =~ s/\/.*$//;
(my $y = $b) =~ s/\/.*$//;
my @a = split(/\./,$x);
my @b = split(/\./,$y);
for (my $i=0;$i<4;$i++) {
next if ($a[$i] == $b[$i]) ;
return $a[$i] <=> $b[$i];
}
}
my @sort = sort ipsort @array ;
for (my $i=0;$i<(@sort);$i++) {
print $sort[$i];
}
|
运行脚本进行排序: perl sortnet.pl <路由表文件>
排序后的结果如下:
58.16.0.0/13
58.144.0.0/16
58.240.0.0/12
60.0.0.0/13
60.8.0.0/15
60.10.0.0/15
......
阅读(5075) | 评论(0) | 转发(0) |