免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: ansanchen
打印 上一主题 下一主题

请教一个shell高深的问题!跪谢! [复制链接]

论坛徽章:
0
21 [报告]
发表于 2006-04-13 16:09 |只看该作者

回复 20楼 slash001 的帖子

slash001 ,高人啊!真是不知道怎么感谢了!!太感谢您了
我还有个请求,我能否加入您的MSN或者QQ。谢谢!!我想学习perl ,我想有问题好请教!!
真的太感谢了!!

另:感谢所有看我帖子和回帖的朋友!!你们真好!CU真好!:D

论坛徽章:
0
22 [报告]
发表于 2006-04-13 16:23 |只看该作者
呵呵,有困难大家相互帮忙吗,不用这么客气,有问题可以来这讨论,学习perl的话可以到perl版,那里很多高手,都会给予帮助的

论坛徽章:
0
23 [报告]
发表于 2006-04-13 17:24 |只看该作者

回复 22楼 slash001 的帖子

谢谢了!再次感谢!!!!
我的MSN是:ansanchen@msn.com
希望您能加我!谢谢!

论坛徽章:
0
24 [报告]
发表于 2006-04-13 20:52 |只看该作者
for i in `58.32.0.0/13` `58.40.0.0/15` ... '58.44.0.0/14'
do
ipcalc -n $i
done
用临时变量判断是否连续。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
25 [报告]
发表于 2006-04-14 01:51 |只看该作者
try 一個 bash 版本的:
  1. #!/bin/bash

  2. file=ip.list

  3. convmask() {
  4.         for i in $(seq $1); do
  5.                 mask_bit="${mask_bit}1"
  6.         done
  7.         for i in $(seq $((32-$1))); do
  8.                 mask_bit="${mask_bit}0"
  9.         done
  10.         for i in 0 8 16 24; do
  11.                 mask_byte="${mask_bit:$i:8}"
  12.                 mask_dec=$(echo "ibase=2;$mask_byte" | bc)
  13.                 _mask="$_mask.$mask_dec"
  14.         done
  15.         echo -n ${_mask:1} | tr . ' '
  16.         unset mask_bit mask_dec _mask i
  17. }

  18. subnet() {
  19.         while [ $# -gt 4 ] ; do
  20.                 ip_dec=$(($1 & $5))
  21.                 _ip="$_ip.$ip_dec"
  22.                 shift 1
  23.         done
  24.         echo -n ${_ip:1}
  25.         unset ip_dec _ip
  26. }

  27. while read line; do
  28.         ip=${line%/*}
  29.         mask=${line#*/}
  30.         subnet ${ip//./ } $(convmask $mask)
  31.         echo "/$mask"
  32. done < $file | sort -nu
复制代码


ps.
不過, 寫完後, 才發現跟樓主的要求不一樣.
算了, 有空再改....  ^_^

[ 本帖最后由 網中人 于 2006-4-14 01:59 编辑 ]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
26 [报告]
发表于 2006-04-14 15:26 |只看该作者
okay, try this:
  1. #!/bin/bash

  2. file=ip.list

  3. convmask() {
  4.         for i in $(seq $1); do
  5.                 mask_bit="${mask_bit}1"
  6.         done
  7.         for i in $(seq $((32-$1))); do
  8.                 mask_bit="${mask_bit}0"
  9.         done
  10.         for i in 0 8 16 24; do
  11.                 mask_byte="${mask_bit:$i:8}"
  12.                 mask_dec=$(echo "ibase=2;$mask_byte" | bc)
  13.                 _mask="$_mask.$mask_dec"
  14.         done
  15.         echo -n ${_mask:1} | tr . ' '
  16.         unset mask_bit mask_dec _mask i
  17. }

  18. calnet() {
  19.         while [ $# -gt 4 ] ; do
  20.                 ip_dec=$(($1 & $5))
  21.                 _ip="$_ip.$ip_dec"
  22.                 shift 1
  23.         done
  24.         echo -n ${_ip:1}
  25.         unset ip_dec _ip
  26. }

  27. count=0
  28. ln=0
  29. last_ln=$(wc -l $file | awk '{print $1}')
  30. while read line; do
  31.         ((ln++))
  32.         subnet=$line
  33.         ip=${line%/*}
  34.         mask=${line#*/}
  35.         supermask=$((mask-1))
  36.         supernet="$(calnet ${ip//./ } $(convmask $supermask) )/$supermask"
  37.         [ $count = 0 ] && {
  38.                 last_sub=$subnet
  39.                 last_net=$supernet
  40.         }
  41.         if [ "$last_net" = "$supernet" ] ; then
  42.                 ((count++))
  43.         else
  44.                 [ $count = 1 ] && net_list="$net_list $subnet" || net_list="$net_list $last_net"
  45.                 last_sub=$subnet
  46.                 last_net=$supernet
  47.                 count=1
  48.         fi
  49.         if [ $ln = $last_ln ]; then
  50.                 [ $count = 1 ] && net_list="$net_list $subnet" || net_list="$net_list $last_net"
  51.         fi
  52. done < $file
  53. echo $net_list | tr ' ' '\n'
复制代码


  1. kenny@linux:~/tmp> cat ip.list
  2. 1.2.0.0/22
  3. 1.2.1.0/22
  4. 1.2.2.0/22
  5. 1.2.3.0/22
  6. 192.168.2.0/24
  7. 192.168.3.0/24
  8. 172.16.0.0/12
  9. 172.17.0.0/12
  10. kenny@linux:~/tmp> ./cal_net.sh
  11. 1.2.0.0/21
  12. 192.168.2.0/23
  13. 172.0.0.0/11
复制代码

评分

参与人数 1可用积分 +2 收起 理由
waker + 2

查看全部评分

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
27 [报告]
发表于 2006-04-14 16:23 |只看该作者
每当看到网兄台的回帖,耳畔仿佛就飘到那首歌

问世间,是否此山最高?有爱的娃子像块宝,天若有情天亦老,爱你爱到忘不了。~~~

论坛徽章:
0
28 [报告]
发表于 2006-04-14 16:55 |只看该作者
原帖由 網中人 于 2006-4-14 15:26 发表
okay, try this:
[code]#!/bin/bash

file=ip.list

convmask() {
        for i in $(seq $1); do
                mask_bit="${mask_bit}1"
        done
        for i in $(seq $((32-$1) ...


网中人大哥这种关于网络地址和掩码的划分是有问题的,无法将子网合并为超网地址

论坛徽章:
0
29 [报告]
发表于 2006-04-14 23:07 |只看该作者
有点理解不了吖。。
既然可以把
58.32.0.0/13
58.40.0.0/15
58.42.0.0/16
58.43.0.0/16
58.44.0.0/14 合并成58.32.0.0/12

那我为什么不可以把所有58开头的合并为58.0.0.0/8 ?
以此类推 貌似答案无数吖。。。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
30 [报告]
发表于 2006-04-15 00:34 |只看该作者
原帖由 slash001 于 2006-4-14 16:55 发表


网中人大哥这种关于网络地址和掩码的划分是有问题的,无法将子网合并为超网地址


恩, 的確不夠嚴謹. 我再改改看.
也順便為代碼加上註解.
  1. #!/bin/bash

  2. file=ip.list

  3. # function: to convert mask from /nn to /nnn.nnn.nnn.nnn
  4. convmask() {
  5.         # bit 1 is set to $1 and bit 0 is set to 32-$1
  6.         mask_bit=$(printf %.$1d 0 | tr 0 1)$(printf %.$((32-$1))d 0)
  7.         # devide 32 bits into 4 parts and convert to decimal
  8.         for i in 0 8 16 24; do
  9.                 mask_byte="${mask_bit:$i:8}"
  10.                 mask_dec=$(echo "ibase=2;$mask_byte" | bc)
  11.                 _mask="$_mask $mask_dec"
  12.         done
  13.         echo -n ${_mask:1}
  14.         unset mask_bit mask_dec _mask i
  15. }

  16. # function: calculate network address ( ip AND mask)
  17. calnet() {
  18.         # parameter 1-4 is IP, parameter 5-8 is mask
  19.         while [ $# -gt 4 ] ; do
  20.                 ip_dec=$(($1 & $5))
  21.                 _ip="$_ip.$ip_dec"
  22.                 shift 1
  23.         done
  24.         echo -n ${_ip:1}
  25.         unset ip_dec _ip
  26. }

  27. listnet () {
  28.   count=0               # reset counter
  29.   ln=0                  # reset line number
  30.   last_ln=$#            # reset last line number

  31.   # start here
  32.   unset net_list
  33.   for subnet; do
  34.         ((ln++))        # count line number
  35.         ip=${subnet%/*}
  36.         mask=${subnet#*/}
  37.         # supernetting in 1 bit less
  38.         supermask=$((mask-1))
  39.         # invoke functions to have supernet
  40.         supernet="$(calnet ${ip//./ } $(convmask $supermask) )/$supermask"
  41.         # for first record only
  42.         [ $count = 0 ] && {
  43.                 last_sub=$subnet
  44.                 last_net=$supernet
  45.         }
  46.         # go next if supernet is identical with previous
  47.         if [ "$last_net" = "$supernet" ] ; then
  48.                 ((count++))     # increase counter if match
  49.         # or to build list
  50.         else
  51.                 # use previous subnet if one line match only, or use previous supernet instead
  52.                 [ $count = 1 ] && net_list="$net_list $last_sub" || net_list="$net_list $last_net"
  53.                 # store subnet and supernet for next loop
  54.                 last_sub=$subnet
  55.                 last_net=$supernet
  56.                 count=1         # reset counter
  57.         fi
  58.         # for final line only
  59.         [ $ln = $last_ln ] && {
  60.                 [ $count = 1 ] && net_list="$net_list $subnet" || net_list="$net_list $last_net"
  61.         }
  62.   done

  63.   # rebuild list in lines
  64.   net_list="$(echo ${net_list# } | tr ' ' '\n')"
  65.   # to have number of records
  66.   nr=$(echo "$net_list" | wc -l)
  67.   # redo the job if number in short
  68.   while [ "$nr" -lt $ln ]; do
  69.         listnet $net_list
  70.   done

  71. }

  72. listnet $(cat $file)

  73. # output
  74. echo "$net_list"

  75. exit 0
复制代码

  1. kenny@linux:~/tmp> cat ip.list
  2. 1.2.0.0/22
  3. 1.2.7.0/22
  4. 1.2.8.0/22
  5. 1.2.15.0/22
  6. 1.2.16.0/22
  7. 192.168.0.0/24
  8. 192.168.1.0/24
  9. 192.168.2.0/24
  10. 192.168.3.0/24
  11. 192.168.14.0/24
  12. 192.168.15.0/24
  13. 192.168.16.0/24
  14. 172.16.0.0/12
  15. 172.32.0.0/12
  16. 10.0.0.0/8
  17. kenny@linux:~/tmp> ./cal_net.sh
  18. 1.2.0.0/20
  19. 1.2.16.0/22
  20. 192.168.0.0/22
  21. 192.168.14.0/23
  22. 192.168.16.0/24
  23. 172.16.0.0/12
  24. 172.32.0.0/12
  25. 10.0.0.0/8
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP