免费注册 查看新帖 |

Chinaunix

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

[文本处理] 求bash程序的精簡化 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-04-17 09:56 |只看该作者 |倒序浏览
小弟是bash的新手最近再参考许多高手写出来一只算IP范围的程序
但总感觉太冗长,想请问一下掩码的那部分应该要怎么改写比较精简。

#!/bin/bash

ip=`echo $1 | cut -d '/' -f1 `
ip1=`echo $1 | cut -d '.' -f1 `
ip2=`echo $1 | cut -d '.' -f2 `
ip3=`echo $1 | cut -d '.' -f3 `
ip4=`echo $1 | cut -d '.' -f4 `
mask=`echo $1 | cut -d '/' -f2 `



if [ $mask -eq 1 ]; then
        maskp=2#10000000.2#00000000.2#00000000.2#00000000
elif [ $mask -eq 2 ]; then
        maskp=2#11000000.2#00000000.2#00000000.2#00000000
elif [ $mask -eq 3 ]; then
        maskp=2#11100000.2#00000000.2#00000000.2#00000000
elif [ $mask -eq 4 ]; then
        maskp=2#11110000.2#00000000.2#00000000.2#00000000
elif [ $mask -eq 5 ]; then
        maskp=2#11111000.2#00000000.2#00000000.2#00000000
elif [ $mask -eq 6 ]; then
        maskp=2#11111100.2#00000000.2#00000000.2#00000000
elif [ $mask -eq 7 ]; then
        maskp=2#11111110.2#00000000.2#00000000.2#00000000
elif [ $mask -eq 8 ]; then
        maskp=2#11111111.2#00000000.2#00000000.2#00000000
elif [ $mask -eq 9 ]; then
        maskp=2#11111111.2#10000000.2#00000000.2#00000000
elif [ $mask -eq 10 ]; then
        maskp=2#11111111.2#11000000.2#00000000.2#00000000
elif [ $mask -eq 11 ]; then
        maskp=2#11111111.2#11100000.2#00000000.2#00000000
elif [ $mask -eq 12 ]; then
        maskp=2#11111111.2#11110000.2#00000000.2#00000000
elif [ $mask -eq 13 ]; then
        maskp=2#11111111.2#11111000.2#00000000.2#00000000
elif [ $mask -eq 14 ]; then
        maskp=2#11111111.2#11111100.2#00000000.2#00000000       
elif [ $mask -eq 15 ]; then
        maskp=2#11111111.2#11111110.2#00000000.2#00000000
elif [ $mask -eq 16 ]; then
        maskp=2#11111111.2#11111111.2#00000000.2#00000000
elif [ $mask -eq 17 ]; then
        maskp=2#11111111.2#11111111.2#10000000.2#00000000
elif [ $mask -eq 18 ]; then
        maskp=2#11111111.2#11111111.2#11000000.2#00000000
elif [ $mask -eq 19 ]; then
        maskp=2#11111111.2#11111111.2#11100000.2#00000000
elif [ $mask -eq 20 ]; then
        maskp=2#11111111.2#11111111.2#11110000.2#00000000
elif [ $mask -eq 21 ]; then
        maskp=2#11111111.2#11111111.2#11111000.2#00000000
elif [ $mask -eq 22 ]; then
        maskp=2#11111111.2#11111111.2#11111100.2#00000000
elif [ $mask -eq 23 ]; then
        maskp=2#11111111.2#11111111.2#11111110.2#00000000
elif [ $mask -eq 24 ]; then
        maskp=2#11111111.2#11111111.2#11111111.2#00000000
elif [ $mask -eq 25 ]; then
        maskp=2#11111111.2#11111111.2#11111111.2#10000000
elif [ $mask -eq 26 ]; then
        maskp=2#11111111.2#11111111.2#11111111.2#11000000
elif [ $mask -eq 27 ]; then
        maskp=2#11111111.2#11111111.2#11111111.2#11100000
elif [ $mask -eq 28 ]; then
        maskp=2#11111111.2#11111111.2#11111111.2#11110000
elif [ $mask -eq 29 ]; then
        maskp=2#11111111.2#11111111.2#11111111.2#11111000
elif [ $mask -eq 30 ]; then
        maskp=2#11111111.2#11111111.2#11111111.2#11111100
elif [ $mask -eq 31 ]; then
        maskp=2#11111111.2#11111111.2#11111111.2#11111110
elif [ $mask -eq 32 ]; then
        maskp=2#11111111.2#11111111.2#11111111.2#11111111

fi



mask1=`echo $maskp | cut -d '.' -f1`
mask2=`echo $maskp | cut -d '.' -f2`
mask3=`echo $maskp | cut -d '.' -f3`
mask4=`echo $maskp | cut -d '.' -f4`

intIP=`echo $ip|awk -F'.' '{print $1*(256^3) + $2*(256^2) + $3*256 + $4}'`       
resultIP=$((intIP|(2**(32-mask)-1)))
echo $((ip1&mask1)).$((ip2&mask2)).$((ip3&mask3)).$((ip4&mask4))-$((resultIP>>24)).$((resultIP>>16&0x00FF)).$((resultIP>>8&0x0000FF)).$((resultIP&0x000000FF))

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
2 [报告]
发表于 2015-04-17 10:25 |只看该作者
回复 1# wxes60921

这个也不是很精简。
没看你的代码,估计整个脚本的思路也许都可以换一换。感觉你这样有点绕弯的样子。
  1. [seesea@UC ~]$ mask=1; echo "obase=2; $(( 0xFFFFFFFF << (32 - mask) ))" | bc | sed -r 's/.*(.{8})(.{8})(.{8})(.{8})$/2#\1.2#\2.2#\3.2#\4/'
  2. 2#10000000.2#00000000.2#00000000.2#00000000
  3. [seesea@UC ~]$ mask=32; echo "obase=2; $(( 0xFFFFFFFF << (32 - mask) ))" | bc | sed -r 's/.*(.{8})(.{8})(.{8})(.{8})$/2#\1.2#\2.2#\3.2#\4/'
  4. 2#11111111.2#11111111.2#11111111.2#11111111
复制代码

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
3 [报告]
发表于 2015-04-17 10:45 |只看该作者
本帖最后由 关阴月飞 于 2015-04-17 10:45 编辑

回复 1# wxes60921


  IP范围是指?  原始需求是啥?

论坛徽章:
0
4 [报告]
发表于 2015-04-17 10:58 |只看该作者
回复 3# 关阴月飞

输入192.168.0.1/24
可以输出该网段所有的IP范围
例如192.168.0.0 ~ 192.168.0.255
   

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
5 [报告]
发表于 2015-04-17 11:10 |只看该作者
回复 4# wxes60921

这个是不是就能得到你的结果?
  1. ipcalc -bn 192.168.0.1/24
复制代码

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
6 [报告]
发表于 2015-04-17 11:15 |只看该作者
回复 5# 关阴月飞


    强大!

论坛徽章:
0
7 [报告]
发表于 2015-04-17 13:27 |只看该作者
回复 5# 关阴月飞


     不知为何看到这个..  笑个不停.....  pf大湿...

论坛徽章:
28
2015年迎新春徽章
日期:2015-03-04 10:16:53午马
日期:2015-03-20 17:11:07亥猪
日期:2015-03-20 17:11:23戌狗
日期:2015-03-20 17:11:33酉鸡
日期:2015-03-20 17:11:47申猴
日期:2015-03-20 17:11:58未羊
日期:2015-03-20 17:12:10子鼠
日期:2015-03-20 17:12:23丑牛
日期:2015-03-20 17:12:40卯兔
日期:2015-03-20 17:12:51辰龙
日期:2015-03-20 17:13:00巳蛇
日期:2015-03-20 17:13:12
8 [报告]
发表于 2015-04-17 13:28 |只看该作者
回复 5# 关阴月飞
学习了...

   

论坛徽章:
0
9 [报告]
发表于 2015-04-17 13:40 |只看该作者
回复 5# 关阴月飞


  这个虽然方便但我写这程序也是有学习的想法在里面,所以希望能写一个来测测

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
10 [报告]
发表于 2015-04-17 15:14 |只看该作者
回复 9# wxes60921

would you like it

$ echo "192.168.0.1/24" | awk -F'[./]' 'function ip(v,b,n,r,d,u){if(!b)b=8;u=2**b;for(n=1;n<=32/b;n++){r=v%u d r;d=(n*b%8==0)?".":"";v=int(v/u)}return(r)}{m=v=0;for(n=1;n<=4;n++)v=v*256+$n;for(n=1;n<=$5;n++)m+=2**(32-n);s=and(v,m);e=or(v,xor(m,2**32-1));printf("%-15s %s\n",ip(s),ip(s,1));printf("%-15s %s\n",ip(e),ip(e,1))}'
192.168.0.0     11000000.10101000.00000000.00000000
192.168.0.255   11000000.10101000.00000000.11111111

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP