免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5707 | 回复: 9
打印 上一主题 下一主题

怎么批量转换路由表和掩码的格式?内详 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 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高手给出精确的批量转换命令!

论坛徽章:
5
IT运维版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-10 06:20:00IT运维版块每日发帖之星
日期:2015-08-23 06:20:00IT运维版块每日发帖之星
日期:2015-08-24 06:20:00IT运维版块每日发帖之星
日期:2015-11-12 06:20:00
2 [报告]
发表于 2011-12-25 12:18 |只看该作者
这个还需要SHELL吗?

一个EXCEL就搞定了。

论坛徽章:
0
3 [报告]
发表于 2011-12-25 14:27 |只看该作者
本帖最后由 axishero 于 2011-12-25 14:27 编辑
ssffzz1 发表于 2011-12-25 12:18


一个EXCEL就搞定了。


怎么弄请说一下

论坛徽章:
5
IT运维版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-10 06:20:00IT运维版块每日发帖之星
日期:2015-08-23 06:20:00IT运维版块每日发帖之星
日期:2015-08-24 06:20:00IT运维版块每日发帖之星
日期:2015-11-12 06:20:00
4 [报告]
发表于 2011-12-26 09:56 |只看该作者
计算子网掩码的公式.rar (1.51 KB, 下载次数: 383)

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

论坛徽章:
0
5 [报告]
发表于 2011-12-26 12:50 |只看该作者
220.115.8.0-220.115.15.255

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

论坛徽章:
0
6 [报告]
发表于 2011-12-26 12:59 |只看该作者
哈哈,版主都提供算法了……亲自出马

论坛徽章:
5
IT运维版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-10 06:20:00IT运维版块每日发帖之星
日期:2015-08-23 06:20:00IT运维版块每日发帖之星
日期:2015-08-24 06:20:00IT运维版块每日发帖之星
日期:2015-11-12 06:20:00
7 [报告]
发表于 2011-12-26 16:54 |只看该作者
19
21
22
21
21
22
19.67807191  这个是个怪胎,CIDR不能对齐。
15
14
24
24
24
24


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

论坛徽章:
0
8 [报告]
发表于 2011-12-27 08:18 |只看该作者
CIDR.sh
  1. #!/bin/bash
  2. function IP2long(){
  3.   local IFS='.'
  4.   read IP1 IP2 IP3 IP4 <<<"$1"
  5.   IP1=$(echo $IP1 | sed 's/^0*//')
  6.   IP1=${IP1:-0}
  7.   IP2=$(echo $IP2 | sed 's/^0*//')
  8.   IP2=${IP2:-0}
  9.   IP3=$(echo $IP3 | sed 's/^0*//')
  10.   IP3=${IP3:-0}
  11.   IP4=$(echo $IP4 | sed 's/^0*//')
  12.   IP4=${IP4:-0}
  13.   echo $((IP1*256*256*256+IP2*256*256+IP3*256+IP4))
  14. }

  15. function long2IP(){
  16.   local IP=$1
  17.   local NET=
  18.   NET=".$(( IP - (IP >> 8 << 8 ) ))${NET}"
  19.   (( IP >>= 8 ))
  20.   NET=".$(( IP - (IP >> 8 << 8 ) ))${NET}"
  21.   (( IP >>= 8 ))
  22.   NET=".$(( IP - (IP >> 8 << 8 ) ))${NET}"
  23.   (( IP >>= 8 ))
  24.   NET="${IP}${NET}"
  25.   echo $NET
  26. }

  27. function cidr(){
  28.   local IFS='~'
  29.   local MASK=0
  30.   local HOSTS=0
  31.   read IPstart IPend <<<"$1"
  32.   start=$(IP2long $IPstart)
  33.   end=$(IP2long $IPend)
  34.   while [ $MASK -le 32 ]
  35.   do
  36.     if [ $(( start + ( 1 << MASK) -1 )) -eq $end ];then
  37.       echo "$IPstart/$(( 32-MASK))"
  38.       break
  39.     elif [ $(( start + (1 << MASK) -1 )) -gt $end ];then
  40.       ((MASK--))
  41.       echo "$IPstart/$(( 32-MASK))"
  42.       (( start += (1<<MASK) ))
  43.       IPstart=$(long2IP $start)
  44.       MASK=0
  45.     elif [ $(( (start>>MASK) % 2 )) -eq 1 ];then
  46.       echo "$IPstart/$(( 32-MASK))"
  47.       (( start += (1<<MASK) ))
  48.       IPstart=$(long2IP $start)
  49.       MASK=0
  50.     else
  51.       (( MASK ++ ))
  52.     fi
  53.   done
  54. }

  55. function formatIP(){
  56.         local IP="$1"
  57.         case $IP in
  58.                 *~*)
  59.                         echo $IP
  60.                         ;;
  61.                 *-*)
  62.                         echo "$IP" | sed 's/-/~/;s/ //g'
  63.                         ;;
  64.                 */*)
  65.                         start=${IP%/*}
  66.                         mask=${IP#*/}
  67.                         mask=$(echo $mask | sed 's/^0*//')
  68.                         if [ ${#mask} -gt 2 ];then
  69.                                 end=$(( $(IP2long $start) + (1<<32) - $(IP2long $mask) -1 ))
  70.                         else
  71.                                 end=$(( $(IP2long $start) + (1 << (32-mask)) -1 ))
  72.                         fi
  73.                         echo "$start~$(long2IP $end)"
  74.                         ;;
  75.                 *)
  76.                         echo
  77.                         ;;
  78.         esac
  79. }

  80. read net1
  81. echo $net1
  82. net1=$(formatIP "$net1")
  83. echo "[$net1]"
  84. start1=$(IP2long ${net1%~*})
  85. end1=$(IP2long ${net1#*~})
  86. while read net2
  87. do
  88.   net2=$(formatIP "$net2")
  89.   start2=$(IP2long ${net2%~*})
  90.   end2=$(IP2long ${net2#*~})
  91.   if [ $((end1+1)) -eq $start2 ];then
  92.     end1=$end2
  93.   else
  94.     cidr "$(long2IP $start1)~$(long2IP $end1)"
  95.     start1=$start2
  96.     end1=$end2
  97.   fi
  98. done
  99. cidr "$(long2IP $start1)~$(long2IP $end1)"
复制代码

  1. cat datafile | ./CIDR.sh
  2. 输出:
  3. 180.88.64.0/19
  4. 220.115.8.0/21
  5. 220.115.224.0/22
  6. 211.161.20.0/22
  7. 211.161.24.0/22
  8. 211.162.32.0/21
  9. 211.162.236.0/22
  10. 220.113.168.0/21
  11. 220.113.176.0/21
  12. 220.113.184.0/22
  13. 211.161.0.0/16
  14. 211.162.0.0/16
  15. 220.112.0.0/14
  16. 203.86.65.0/24
  17. 203.86.67.0/24
  18. 203.86.68.0/23

复制代码

论坛徽章:
0
9 [报告]
发表于 2011-12-27 18:28 |只看该作者
springwind426 发表于 2011-12-27 08:18
CIDR.sh

Nice

论坛徽章:
0
10 [报告]
发表于 2015-03-24 15:23 |只看该作者
回复 1# axishero


    同样遇到这个问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP