免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
11 [报告]
发表于 2006-04-12 22:59 |只看该作者

回复 10楼 xlink 的帖子

不是 我要从apnic寻找网通和电信的IP分类。但是他们没有把IP合并。
我现在就是需要合并一下。比如,他仅仅是告诉我2个B和另外2个B分给电信,其实这4个B是连续的。
只不过不同时间分配的。所以就分开了。

我现在要把连续的几个B或者几个C合并!

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

回复 9楼 xlink 的帖子

商业气息?我觉得这个应该不复杂,小弟脑子比较迟钝~~赫赫。
excel搞不定吧?
不懂~

论坛徽章:
0
13 [报告]
发表于 2006-04-12 23:06 |只看该作者
原帖由 ansanchen 于 2006-4-12 22:59 发表
不是 我要从apnic寻找网通和电信的IP分类。但是他们没有把IP合并。
我现在就是需要合并一下。比如,他仅仅是告诉我2个B和另外2个B分给电信,其实这4个B是连续的。
只不过不同时间分配的。所以就分开了。

我现 ...

程序能做的,仅仅是有规律的事,你首先把规律描述清楚。

你的问题不太难,难的是别人不明白你想干什么。

你尽量描述,这里高手很多。只要你说清楚问题,3分钟之内就会有答案了(我不一定行的)。

论坛徽章:
0
14 [报告]
发表于 2006-04-12 23:08 |只看该作者
原帖由 ansanchen 于 2006-4-12 23:00 发表
商业气息?我觉得这个应该不复杂,小弟脑子比较迟钝~~赫赫。
excel搞不定吧?
不懂~

呵呵,excel比shell强大多了,也不难学。

论坛徽章:
0
15 [报告]
发表于 2006-04-12 23:14 |只看该作者

回复 14楼 xlink 的帖子

我想想怎么描述,明天我再贴出来。

谢谢了!!:)

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

回复 13楼 xlink 的帖子

大概意思就是,我需要把连续IP合并,并以掩码形式表示出来!
谁能帮我!!谢谢了!!

论坛徽章:
0
17 [报告]
发表于 2006-04-13 14:00 |只看该作者
LZ是想按掩码位数分类吗?

论坛徽章:
0
18 [报告]
发表于 2006-04-13 14:40 |只看该作者

回复 17楼 creat7151 的帖子

赫赫 看来我还是没说清楚!小学语文不太好,大家见谅!我的意思是 比如现在有两个2B 那就可以合并成4个B。但是前提是这2个2个B的IP是连续的 可以合成4个B

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
19 [报告]
发表于 2006-04-13 14:51 |只看该作者
将 1.2.3.4/24规范为 1.2.3.0/24
然后按ip倒排序送给awk处理

取每条记录 如1.2.3.0/24,算出1.2.3.0/23的规范格式,如果h不空则和h比较(如不同首先打印h,然后比较1.2.3.0/24和1.2.3.0/23的地址部分,相同则打印1.2.3.0/24,否则h=1.2.3.0/23),如相同则规范1.2.3.0/22,如1.2.3.0/23和 1.2.3.0/22地址部分相同,则打印1.2.3.0/23,否则 h=1.2.3.0/22的规范格式。

论坛徽章:
0
20 [报告]
发表于 2006-04-13 14:59 |只看该作者
用perl给你写了一个,代码如下


  1. #!/usr/bin/perl

  2. use strict;

  3. sub main
  4. {
  5.         my $ipaddr = "0.0.0.0";       
  6.         my $old_ip = "0.0.0.0";

  7.         open(F, "ip_list.txt");
  8.         while (<F>)
  9.         {
  10.                 my $line = $_;
  11.                 chomp($line);
  12.                 my @data = split(/\//, $line);
  13.                 my @ip = ipaddressCalc($data[0], bit2mask($data[1]));
  14.                
  15.                 if (testIpNext($old_ip, $ip[0]) == 0)
  16.                 {
  17.                         if ($ipaddr ne "0.0.0.0")
  18.                         {
  19.                                 print "$ipaddr/" . calcBit($ipaddr, $old_ip) . "\n";
  20.                         }
  21.                        
  22.                         $ipaddr = $ip[0];
  23.                 }
  24.                 $old_ip = $ip[1];
  25.         }

  26.         if ($ipaddr ne "0.0.0.0")
  27.         {
  28.                 print "$ipaddr/" . calcBit($ipaddr, $old_ip) . "\n";
  29.         }
  30.         close(F);
  31. }

  32. sub ipaddressCalc
  33. {       
  34.         my ($ip, $mask) = @_;
  35.         my $netip = "";
  36.         my $broadcastip = "";
  37.         my @splitIp = split(/\./, $ip);
  38.         my @splitMask = split(/\./, $mask);

  39.         for (my $i = 0; $i < 4; $i++)
  40.         {
  41.                 $netip .= $splitMask[$i] == 255 ? $splitIp[$i] : ($splitIp[$i] & $splitMask[$i]);
  42.                 $broadcastip .= $splitMask[$i] == 255 ? $splitIp[$i] : (255 - $splitMask[$i]) + ($splitIp[$i] & $splitMask[$i]);
  43.                  
  44.                 if ($i != 3)
  45.                 {
  46.                         $netip .= ".";
  47.                         $broadcastip .= ".";
  48.                 }
  49.         }
  50.         return $netip, $broadcastip;
  51. }

  52. sub bit2mask
  53. {
  54.         my ($bit) = shift;
  55.         my $str_bit = 1 x $bit . 0 x (32 - $bit);
  56.         my $mask = "";

  57.         for (my $i = 0; $i < 4; $i++)
  58.         {
  59.                 my $segment = substr($str_bit, $i*8, 8);
  60.                 $segment =~ s/(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)/$1*128+$2*64+$3*32+$4*16+$5*8+$6*4+$7*2+$8*1/;
  61.                 $mask .= $mask eq "" ? eval("$segment") : "." . eval("$segment");
  62.         }

  63.         return $mask;
  64. }

  65. sub calcBit
  66. {
  67.         my ($b_addr, $e_addr) = @_;
  68.         my @b_addrs = split(/\./, $b_addr);
  69.         my @e_addrs = split(/\./, $e_addr);
  70.         my $b_bin = sprintf("%08b%08b%08b%08b", $b_addrs[0], $b_addrs[1], $b_addrs[2], $b_addrs[3]);
  71.         my $e_bin = sprintf("%08b%08b%08b%08b", $e_addrs[0], $e_addrs[1], $e_addrs[2], $e_addrs[3]);
  72.         my $bit = 0;
  73.         for (my $i = 0; $i < 32; $i++)
  74.         {
  75.                 return $bit if (substr($b_bin, $i, 1) != substr($e_bin, $i, 1));
  76.                 $bit++;
  77.         }
  78.         return 32;
  79. }

  80. sub testIpNext
  81. {
  82.         my ($f_ip, $n_ip) = @_;
  83.         my @f_ips = split(/\./, $f_ip);
  84.         my @n_ips = split(/\./, $n_ip);
  85.         my $flag = 1;
  86.        
  87.         for (my $i = 3; $i >= 0; $i--)
  88.         {
  89.                 if ($flag == 1 and ($f_ips[$i] + 1) > 255)
  90.                 {
  91.                         $flag = 1;
  92.                         $f_ips[$i] = 0;
  93.                 }
  94.                 elsif ($flag == 1 and ($f_ips[$i] + 1) <= 255)
  95.                 {
  96.                         $flag = 0;
  97.                         $f_ips[$i] += 1;
  98.                 }
  99.         }

  100.         return 1 if (sprintf("%03d%03d%03d%03d", @f_ips) == sprintf("%03d%03d%03d%03d", @n_ips));
  101.         return 0;
  102. }

  103. main();

复制代码


其中ip_list.txt是你保存ip列表的文件名

[ 本帖最后由 slash001 于 2006-4-13 15:15 编辑 ]

评分

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

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP