查找一系列IP之间的所有IP

时间:2013-12-03 13:15:32

标签: perl shell awk grep cut

我有一个文件,其内容是这样的

 164.91.32.120 164.91.32.123
 164.91.32.127 164.91.32.128
 164.91.32.131 164.91.32.132
 164.91.32.137 164.91.32.200
 164.91.33.20 164.91.33.161

找出范围之间的所有IP并使用shell脚本在这样的文件中打印输出的任何方法

 164.91.32.120
 164.91.32.121
 164.91.32.122
 164.91.32.123
 164.91.32.127
 164.91.32.128
 164.91.32.131

依旧......

3 个答案:

答案 0 :(得分:1)

您可以将开头和结尾IP转换为32位数,以+1为增量迭代其范围,并将结果数字转换回IP格式。

答案 1 :(得分:1)

IPv4地址只是32位数字。

sub ip_to_num { unpack 'N', pack 'C4', split /\./, $_[0] }
sub num_to_ip { join '.', unpack 'C4', pack 'N', $_[0] }

say num_to_ip($_) for ip_to_num($ip_from) .. ip_to_num($ip_to);

答案 2 :(得分:0)

到目前为止,您尝试过哪些实施方案?你有可以展示的代码吗?

您始终可以使用Perl读取文本文件,拆分IP范围之间的空格/制表符,然后进行字符串解析。

示例:

#!/usr/bin/perl
use strict;
use warnings;

open(INPUT_FILEHANDLE, "myfile.txt") or die("$!");
open(OUTPUT_FH, ">>outfile.txt") or die("$!");
while(chomp(my $line = <INPUT_FILEHANDLE>)) {
    my @split = split(" ", $line);
    my @octets_first = split(".", $split[0]);
    my @octets_second = split(".", $split[1]);
    my $subnet = $split[0].$split[1].$split[2];
    my $difference = $octets_second[3] - $octets_first[3];
    for(my $i = $octets_first[3]; $i < $difference; $i++) {
        print OUTPUT_FH $subnet.$i;
        print OUTPUT_FH "\n";
    }
}
close(INPUT_FILEHANDLE);
close(OUTPUT_FH);