Chinaunix首页 | 论坛 | 博客
  • 博客访问: 591421
  • 博文数量: 40
  • 博客积分: 7274
  • 博客等级: 少将
  • 技术积分: 410
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-20 15:00
个人简介

Expired

文章分类
文章存档

2011年(1)

2008年(3)

2007年(17)

2006年(10)

2005年(9)

分类:

2007-10-02 22:16:26

有一个路由表文件,里面每一行的格式为 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
......
阅读(5030) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~