Chinaunix首页 | 论坛 | 博客
  • 博客访问: 13836
  • 博文数量: 4
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 37
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-19 00:26
文章分类

全部博文(4)

文章存档

2013年(4)

我的朋友

分类: LINUX

2013-04-02 15:47:40


实现的功能:
    当整理地址段使用时,若主类地址被划分成了多段使用,可以自动将子类地址段汇聚成主类地址段。方便大家直观感受到网络的已分配地址情况。

点击(此处)折叠或打开

  1. #!/bin/bash
  2. function IP2long(){
  3.   local IFS='.'
  4.   read IP1 IP2 IP3 IP4 <<<"$1"
  5.   echo $((IP1*256*256*256+IP2*256*256+IP3*256+IP4))
  6. }

  7. function long2IP(){
  8.   local IP=$1
  9.   local NET=
  10.   NET=".$(( IP - (IP >> 8 << 8 ) ))${NET}"
  11.   (( IP >>= 8 ))
  12.   NET=".$(( IP - (IP >> 8 << 8 ) ))${NET}"
  13.   (( IP >>= 8 ))
  14.   NET=".$(( IP - (IP >> 8 << 8 ) ))${NET}"
  15.   (( IP >>= 8 ))
  16.   NET="${IP}${NET}"
  17.   echo $NET
  18. }

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

  47. function formatIP(){
  48.   case $1 in
  49.     *~*)
  50.       echo $1
  51.       ;;
  52.     */*)
  53.       start=${1%/*}
  54.       mask=${1#*/}
  55.       if [ ${#mask} -gt 2 ];then
  56.         end=$(( $(IP2long $start) + (1<<32) - $(IP2long $mask) -1 ))
  57.       else
  58.         end=$(( $(IP2long $start) + (1 << (32-mask)) -1 ))
  59.       fi
  60.       echo "$start~$(long2IP $end)"
  61.       ;;
  62.     *)
  63.       echo
  64.       ;;
  65.   esac
  66. }

  67. read net1
  68. net1=$(formatIP $net1)
  69. start1=$(IP2long ${net1%~*})
  70. end1=$(IP2long ${net1#*~})
  71. while read net2
  72. do
  73.   net2=$(formatIP $net2)
  74.   start2=$(IP2long ${net2%~*})
  75.   end2=$(IP2long ${net2#*~})
  76.   if [ $end1 -ge $end2 ];then
  77.           continue
  78.   elif [ $((end1+1)) -eq $start2 ];then
  79.     end1=$end2
  80.   else
  81.     cidr "$(long2IP $start1)~$(long2IP $end1)"
  82.     start1=$start2
  83.     end1=$end2
  84.   fi
  85. done
  86. cidr "$(long2IP $start1)~$(long2IP $end1)"
    使用方法是 ./CIDR.sh < 数据文件。数据文件要求是排列过的(sort -n file > file.sorted)
        转载自:
阅读(318) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~