怎么批量转换路由表和掩码的格式?内详
本帖最后由 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高手给出精确的批量转换命令!
这个还需要SHELL吗?
一个EXCEL就搞定了。 本帖最后由 axishero 于 2011-12-25 14:27 编辑
ssffzz1 发表于 2011-12-25 12:18 static/image/common/back.gif
一个EXCEL就搞定了。
怎么弄请说一下
我经过深思熟虑。深感这个东西非要我亲自出手来做不可啊。你自己看看里面的公式吧,很简单的。在EXCEL中吧TXT文件导入(设置好分隔符)然后拉一下公式就OK了。 220.115.8.0-220.115.15.255
看这个就知道你算的不对了吧,如果弄成无类的感觉也不容易 哈哈,版主都提供算法了……亲自出马:luya: 19
21
22
21
21
22
19.67807191这个是个怪胎,CIDR不能对齐。
15
14
24
24
24
24
俺这个工具还是可以的,证明。
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
springwind426 发表于 2011-12-27 08:18 static/image/common/back.gif
CIDR.sh
Nice:emn15: 回复 1# axishero
同样遇到这个问题
页:
[1]