将IP范围转换为IP地址

时间:2014-03-27 21:48:24

标签: bash

我有一个包含IP范围的原始文件(xx.xx.xx。 xx -yy.yy.yy。 yy ) 我想创建一个新的列表,其范围转换为单个IP地址。 (所有范围均在1-255范围内)

条件

(1)如果每条线上第四个IP八位字节之间的差值小于或等于最大值
    变量(比如5)它将循环并将每次迭代报告为单个/ 32地址。

(2)具有超过最大变量的IP地址将报告为带有/ 24

的IP地址

以下bash脚本运行正常但在50,000行文件上运行缓慢? 任何帮助,将不胜感激。它是执行其他功能的脚本的一部分,所以我需要留在BASH。

for i in $data; do

    A=$(echo $i | sed 's/-.*//'); B=$(echo $i | sed 's/^.*-//')
    A1=$(echo $A | cut -d '.' -f 4); B1=$(echo $B | cut -d '.' -f 4)
    diff=`expr $B1 - $A1`

    if [ "$diff" == "0" ]; then
            echo $A >> $outfile
    elif [ "$diff" -gt "0" -a "$diff" -le $max ]; then
            echo $A >> $outfile
            for a in $(jot "$diff"); do
                    count=`expr $A1 + $a`
                    echo $A | sed "s/\.[0-9]*$/.$count/" >> $outfile
            done
    else
            echo $A | sed 's/\.[0-9]*$/.0\/24/' >> $outfile
    fi
done

2 个答案:

答案 0 :(得分:1)

你的脚本对于50000行来说速度太慢的可能原因是你bash调用了很多外部程序(sedcutjot,{{ 1}}),在内循环和外循环的每次迭代中多次。当在多次迭代中进行复合时,分割外部进程会增加大量的时间开销。

如果您想在bash中执行此操作并提高性能,则需要使用bash中内置的等效功能。我为你的剧本拍了一下,然后想出了这个。我试图保持功能相同:

expr

特别是我已经大量使用了parameter expansionsarithmetic expansions。我有兴趣看看它比原版有什么样的加速(如果有的话)。我认为它应该明显更快。

答案 1 :(得分:0)

如果您可以使用python,请安装(下载,提取并运行sudo python setup.py install)ipaddr库https://pypi.python.org/pypi/ipaddr,然后编写类似这样的内容

import ipaddr
for ip in (ipaddr.IPv4Network('192.0.2.0/24')):
    print ip