2014-03-27 312 views
2

我有一個原始文件與IP地址範圍(xx.xx.xx. XX -yy.yy.yy. YY) 我想創建一個轉換的範圍的新名單到單個IP地址。 (所有的範圍都在1-255範圍)轉換IP範圍的IP地址

條件

(1)如在每行的第四個八比特組IP之間的差小於或等於最大
變量(比方說5 )它將循環並將每個迭代報告爲單個/ 32地址。

(2)IP地址比最大變量更會被報告爲/ 24

以下bash腳本工作正常,IP地址,但它是50000行的文件慢? 任何幫助,將不勝感激。它是其他功能的腳本的一部分,所以我需要留在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 
+0

我建議使用已經有庫來操縱ipv4地址的語言。不要重新發明輪子。 –

+0

@Glenn,你會怎麼做這是「perl」。我可以從這個bash腳本中調用一個簡短的perl腳本。 – CA171

+0

CPAN快速搜索「ip地址範圍」顯示https://metacpan.org/pod/Net::IPAddress::Util::Range看起來像它做你想做的。 –

回答

1

可能的原因你的腳本是50000這麼慢行是你有bash調用大量的外部程序(sed,cut,jot,expr),在你的內部和外部循環的每次迭代中都會多次。當多次迭代複合時,分叉外部進程會增加大量時間開銷。

如果你想在bash中做到這一點,並提高性能,你需要利用內置到bash中的等效功能。我爲你的劇本刺了一針,並提出了這個問題。我試圖保持的功能是相同的:

for i in $data; do 

    A="${i%-*}"; B="${i#*-}" 
    A1="${A##*.}"; B1="${B##*.}" 
    diff=$(($B1 - $A1)) 

    if [ "$diff" == "0" ]; then 
      echo $A >> $outfile 
    elif [ "$diff" -gt "0" -a "$diff" -le $max ]; then 
      echo $A >> $outfile 
      for ((a=1; a<=$diff; a++)); do 
        count=$(($A1 + $a)) 
        echo "${A%.*}.$count" >> $outfile 
      done 
    else 
      echo "${A%.*}.0/24" >> $outfile 
    fi 
done 

尤其是我做了很多使用的parameter expansionsarithmetic expansions的。我有興趣看看這種加速比原來有什麼樣的加速(如果有的話)。我認爲它應該快得多。

+0

哇。從5分鐘到5秒。非常感謝!我必須使用Jot命令作爲第二個「for循環」在sh中不起作用。它是一個pfSense Freebsd Box。 – CA171

+1

我想你可以用while循環替換'for $(jot)'並手動增加計數器。但我很高興60倍的加速。 Upvotes將被優雅地接受:) –

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