免费注册 查看新帖 |

Chinaunix

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

shell计算网段计算机个数 [复制链接]

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

  1. perl -ne '$tmp=$_;s/\b[0]([1-9]\d)/\1/g;s/(\d+)\.(\d+).(\d+)\.(\d+)[\W]+(\d+)\.(\d+)\.(\d+)\.(\d+)/((\5-\1+1)*(\6-\2+1)*(\7-\3+1)*(\8-\4+1))/;$_=eval $_;$tmp=~s/[\s-].*/ $_/;print $tmp' a.txt
复制代码


结果

  1. 218.022.121.000 1792
  2. 218.022.128.000 4096
  3. 058.060.000.000 49152
  4. 058.061.096.000 40960
  5. 058.062.000.000 16384
  6. 058.062.064.000 4096
  7. 058.062.080.000 -11152    这行有问题
  8. 058.063.038.144 6496


  9. ((218-218+1)*(22-22+1)*(127-121+1)*(255-000+1))
  10. 218.022.121.000 1792
  11. ((218-218+1)*(22-22+1)*(143-128+1)*(255-000+1))
  12. 218.022.128.000 4096
  13. ((58-58+1)*(61-60+1)*(95-000+1)*(255-000+1))
  14. 058.060.000.000 49152
  15. ((58-58+1)*(61-61+1)*(255-96+1)*(255-000+1))
  16. 058.061.096.000 40960
  17. ((58-58+1)*(62-62+1)*(63-000+1)*(255-000+1))
  18. 058.062.000.000 16384
  19. ((58-58+1)*(62-62+1)*(79-64+1)*(255-000+1))
  20. 058.062.064.000 4096
  21. ((58-58+1)*(63-62+1)*(38-80+1)*(135-000+1))    问题出在借位上这个如果要完美点那就不是这几句了
  22. 058.062.080.000 -11152
  23. ((58-58+1)*(63-63+1)*(95-38+1)*(255-144+1))
  24. 058.063.038.144 6496
复制代码

另外给出AWK的那位兄弟代码域分界可能和你的要求不一样改一改就能用了我的麻烦些不过都解决不了上面那个借位问题

[ 本帖最后由 lovesaka 于 2006-10-23 14:17 编辑 ]

论坛徽章:
0
12 [报告]
发表于 2006-10-23 14:14 |只看该作者
[quote]原帖由 lovesaka 于 2006-10-23 14:11 发表

  1. perl -ne '$tmp=$_;s/\b[0]([1-9]\d)/\1/g;s/(\d+)\.(\d+).(\d+)\.(\d+)[\W]+(\d+)\.(\d+)\.(\d+)\.(\d+)/((\5-\1+1)*(\6-\2+1)*(\7-\3+1)*(\8-\4+1))/;$_=eval $_;$tmp=~s/[\s-].*/ $_/;print $tmp' a.t ... [/quote]


  2. 谢谢你的帮助 不过还是有一个是负数的 请你看看我的运行结果

  3. [code]
  4. [root@aorta test]# sh test1.sh
  5. 218.022.121.000 1792
  6. 218.022.128.000 4096
  7. 058.060.000.000 49152
  8. 058.061.096.000 40960
  9. 058.062.000.000 16384
  10. 058.062.064.000 4096
  11. 058.062.080.000 -11152
  12. 058.063.038.144 6496

复制代码

论坛徽章:
0
13 [报告]
发表于 2006-10-23 16:28 |只看该作者
原帖由 lovesaka 于 2006-10-23 14:11 发表
[code]
perl -ne '$tmp=$_;s/\b[0]([1-9]\d)/\1/g;s/(\d+)\.(\d+).(\d+)\.(\d+)[\W]+(\d+)\.(\d+)\.(\d+)\.(\d+)/((\5-\1+1)*(\6-\2+1)*(\7-\3+1)*(\8-\4+1))/;$_=eval $_;$tmp=~s/[\s-].*/ $_/;print $tmp' a.t ...



我刚刚用 AWK的那位兄弟代码域分界改一改就能用  不过出现的是一样的结果 有 负数

论坛徽章:
0
14 [报告]
发表于 2006-10-23 16:58 |只看该作者
哦,酱紫啊

论坛徽章:
0
15 [报告]
发表于 2006-10-23 16:59 |只看该作者
也好办,你等等

论坛徽章:
0
16 [报告]
发表于 2006-10-23 17:15 |只看该作者
压,不行,呵呵

论坛徽章:
0
17 [报告]
发表于 2006-10-23 17:23 |只看该作者
  1. awk -F'[. -]' '
  2. {
  3.         counts1 = 0; counts2 = 0;
  4.         for (i = 3; i >= 0; i--){
  5.                 counts1 = counts1 * 256 + $(NF-i);
  6.                 counts2 = counts2 * 256 + $(4-i);
  7.         }
  8.     print $1"."$2"."$3"."$4, counts1 - counts2 + 1;
  9. }' urfile
复制代码

论坛徽章:
0
18 [报告]
发表于 2006-10-23 17:28 |只看该作者
原本以为这样可以,后来一想是不对的

论坛徽章:
0
19 [报告]
发表于 2006-10-23 17:46 |只看该作者
当我欠你的了。。试一下这个,不行再说
  1. awk -F'[. -]' '
  2. {
  3.         counts = 1;

  4.         for (i = 3; i >= 0; i--){
  5.                 counts1[i] = $(NF-i);
  6.                 counts2[i] = $(4-i);
  7.         }

  8.         for (i = 0; i < 4; i++) if (counts1[i] < counts2[i]){ counts1[i+1]--; counts1[i] += 256; }
  9.         for (i = 0; i < 4; i++) counts *= (counts1[i] - counts2[i] + 1);

  10.         print $1"."$2"."$3"."$4, counts;
  11. }' urfile
复制代码

论坛徽章:
0
20 [报告]
发表于 2006-10-23 18:46 |只看该作者
[quote]原帖由 awk就是awp加ak 于 2006-10-23 17:46 发表
当我欠你的了。。试一下这个,不行再说
  1. awk -F'[. -]' '
  2. {
  3.         counts = 1;

  4.         for (i = 3; i >= 0; i--){
  5.                 counts1[i] = $(NF-i);
  6.                 counts2[i] = $(4-i);
  7.         }

  8.         for (i = 0; i < 4; i++) if (c ... [/quote]







  9. [code]
  10. 谢谢你热心的帮助
  11. 运行结果如下:
  12. [root@root test]# cat a
  13. 060.166.000.000 060.166.255.255                  
  14. 060.167.000.000 060.167.127.255                  
  15. 060.167.128.000 060.169.255.255            
  16. 060.170.000.000 060.170.127.255                  
  17. 060.170.128.000 060.170.255.255            
  18. 060.171.000.000 060.171.063.255  
复制代码


  1. [root@root test]# cat test.sh
  2. #!/bin/bash
  3. awk -F'[. -]' '
  4. {
  5.         counts = 1;

  6.         for (i = 3; i >= 0; i--){
  7.                 counts1[i] = $(NF-i);
  8.                 counts2[i] = $(4-i);
  9.         }

  10.         for (i = 0; i < 4; i++) if (counts1[i] < counts2[i]){ counts1[i+1]--; counts1[i] += 256; }
  11.         for (i = 0; i < 4; i++) counts *= (counts1[i] - counts2[i] + 1);

  12.         print $1"."$2"."$3"."$4, counts;
  13. }' a


复制代码



  1. [root@root test]# sh test.sh
  2. 060.166.000.000 1160570880
  3. 060.167.000.000 1147675648
  4. 060.167.128.000 573837824
  5. 060.170.000.000 1108989952
  6. 060.170.128.000 554494976
  7. 060.171.000.000 1096094720
复制代码


ip数太夸张了吧? 呵呵 上亿? a文件的这些ip段只是国内安徽省的ip

是不是我那里出错了么?

[ 本帖最后由 frankzh 于 2006-10-23 18:48 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP