axishero 发表于 2011-12-25 12:03

怎么批量转换路由表和掩码的格式?内详

本帖最后由 axishero 于 2011-12-25 12:03 编辑

网上找到个长城宽带的路由表是这种格式的:
180.88.64.0-180.88.95.255
220.115.8.0-220.115.15.255
220.115.224.0-220.115.227.255
211.161.20.0-211.161.27.255
211.162.32.0-211.162.39.255
211.162.236.0-211.162.239.255
220.113.168.0-220.113.187.255
211.161.0.0-211.162.255.255
220.112.0.0-220.115.255.255
203.86.65.0-203.86.65.255
203.86.67.0-203.86.67.255
203.86.68.0-203.86.68.255
203.86.69.0-203.86.69.255
.......................................
需要把他转成类似这样的:
180.88.0.0/16
220.115.0.0/16
220.115.0.0/16
211.161.0.0/16
211.162.0.0/16
220.113.0.0/16
220.112.0.0/16
220.113.0.0/16
220.114.0.0/16
220.115.0.0/16
203.86.65.0/24
203.86.67.0/24
203.86.68.0/24
这个我上面转的并不精确。

请shell高手给出精确的批量转换命令!

ssffzz1 发表于 2011-12-25 12:18

这个还需要SHELL吗?

一个EXCEL就搞定了。

axishero 发表于 2011-12-25 14:27

本帖最后由 axishero 于 2011-12-25 14:27 编辑

ssffzz1 发表于 2011-12-25 12:18 static/image/common/back.gif


一个EXCEL就搞定了。

怎么弄请说一下

ssffzz1 发表于 2011-12-26 09:56



我经过深思熟虑。深感这个东西非要我亲自出手来做不可啊。你自己看看里面的公式吧,很简单的。在EXCEL中吧TXT文件导入(设置好分隔符)然后拉一下公式就OK了。

aplah 发表于 2011-12-26 12:50

220.115.8.0-220.115.15.255

看这个就知道你算的不对了吧,如果弄成无类的感觉也不容易

满天星 发表于 2011-12-26 12:59

哈哈,版主都提供算法了……亲自出马:luya:

ssffzz1 发表于 2011-12-26 16:54

19
21
22
21
21
22
19.67807191这个是个怪胎,CIDR不能对齐。
15
14
24
24
24
24


俺这个工具还是可以的,证明。

springwind426 发表于 2011-12-27 08:18

CIDR.sh#!/bin/bash
function IP2long(){
local IFS='.'
read IP1 IP2 IP3 IP4 <<<"$1"
IP1=$(echo $IP1 | sed 's/^0*//')
IP1=${IP1:-0}
IP2=$(echo $IP2 | sed 's/^0*//')
IP2=${IP2:-0}
IP3=$(echo $IP3 | sed 's/^0*//')
IP3=${IP3:-0}
IP4=$(echo $IP4 | sed 's/^0*//')
IP4=${IP4:-0}
echo $((IP1*256*256*256+IP2*256*256+IP3*256+IP4))
}

function long2IP(){
local IP=$1
local NET=
NET=".$(( IP - (IP >> 8 << 8 ) ))${NET}"
(( IP >>= 8 ))
NET=".$(( IP - (IP >> 8 << 8 ) ))${NET}"
(( IP >>= 8 ))
NET=".$(( IP - (IP >> 8 << 8 ) ))${NET}"
(( IP >>= 8 ))
NET="${IP}${NET}"
echo $NET
}

function cidr(){
local IFS='~'
local MASK=0
local HOSTS=0
read IPstart IPend <<<"$1"
start=$(IP2long $IPstart)
end=$(IP2long $IPend)
while [ $MASK -le 32 ]
do
    if [ $(( start + ( 1 << MASK) -1 )) -eq $end ];then
      echo "$IPstart/$(( 32-MASK))"
      break
    elif [ $(( start + (1 << MASK) -1 )) -gt $end ];then
      ((MASK--))
      echo "$IPstart/$(( 32-MASK))"
      (( start += (1<<MASK) ))
      IPstart=$(long2IP $start)
      MASK=0
    elif [ $(( (start>>MASK) % 2 )) -eq 1 ];then
      echo "$IPstart/$(( 32-MASK))"
      (( start += (1<<MASK) ))
      IPstart=$(long2IP $start)
      MASK=0
    else
      (( MASK ++ ))
    fi
done
}

function formatIP(){
        local IP="$1"
        case $IP in
                *~*)
                        echo $IP
                        ;;
                *-*)
                        echo "$IP" | sed 's/-/~/;s/ //g'
                        ;;
                */*)
                        start=${IP%/*}
                        mask=${IP#*/}
                        mask=$(echo $mask | sed 's/^0*//')
                        if [ ${#mask} -gt 2 ];then
                                end=$(( $(IP2long $start) + (1<<32) - $(IP2long $mask) -1 ))
                        else
                                end=$(( $(IP2long $start) + (1 << (32-mask)) -1 ))
                        fi
                        echo "$start~$(long2IP $end)"
                        ;;
                *)
                        echo
                        ;;
        esac
}

read net1
echo $net1
net1=$(formatIP "$net1")
echo "[$net1]"
start1=$(IP2long ${net1%~*})
end1=$(IP2long ${net1#*~})
while read net2
do
net2=$(formatIP "$net2")
start2=$(IP2long ${net2%~*})
end2=$(IP2long ${net2#*~})
if [ $((end1+1)) -eq $start2 ];then
    end1=$end2
else
    cidr "$(long2IP $start1)~$(long2IP $end1)"
    start1=$start2
    end1=$end2
fi
done
cidr "$(long2IP $start1)~$(long2IP $end1)"

cat datafile | ./CIDR.sh
输出:
180.88.64.0/19
220.115.8.0/21
220.115.224.0/22
211.161.20.0/22
211.161.24.0/22
211.162.32.0/21
211.162.236.0/22
220.113.168.0/21
220.113.176.0/21
220.113.184.0/22
211.161.0.0/16
211.162.0.0/16
220.112.0.0/14
203.86.65.0/24
203.86.67.0/24
203.86.68.0/23

aplah 发表于 2011-12-27 18:28

springwind426 发表于 2011-12-27 08:18 static/image/common/back.gif
CIDR.sh
Nice:emn15:

wepon001 发表于 2015-03-24 15:23

回复 1# axishero


    同样遇到这个问题
页: [1]
查看完整版本: 怎么批量转换路由表和掩码的格式?内详