免费注册 查看新帖 |

Chinaunix

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

用脚本如何实现这个功能? --SHELL高手的挑战 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-03-03 17:42 |只看该作者 |倒序浏览
局方提供一个IP规划的文本,我需要整理后插入数据库表中,文本格式为:
如:
 局名  IP列表或IP段 (IP间用,分隔,网段用-表示)

 nanjing  10.2.3.10
   nanjing  10.23.53.13,192.168.10.100-145 (即网段)
 suzhou  192.201.12.32,192.201.24.100,202.25.19.11


我要的结果文件为
 局名  IP地址
如:
 nanjing  10.2.3.10
  nanjing  10.23.53.13
nanjing  192.168.10.100
nanjing 192.168.10.101
...
...
suzhou 192.201.12.32
suzhou 192.201.24.100
...

论坛徽章:
0
2 [报告]
发表于 2004-03-03 17:50 |只看该作者

用脚本如何实现这个功能? --SHELL高手的挑战

这不叫难题, 不过繁琐一点, 三个awk就可以搞定.

论坛徽章:
0
3 [报告]
发表于 2004-03-03 21:21 |只看该作者

用脚本如何实现这个功能? --SHELL高手的挑战

我提供个思路,这个确实繁琐了些。
1: 先把所有的分隔符换成","号,
sed -e 's/ /,/g' -e 's/\./,/g' -e 's/-/,/g' 方便awk定位。
2:一段awk 程序:
awk '{
        if($13!~/^$/){
                while($9<256){
                        print $1,$6,$7,$8,$9++ ;
                }
                $8++;
                while($8<256){
                        for(i=0;i<256;i++){
                                print $1,$6,$7,$8,i;
                        }$8++;
                }
                $7++;
                while($7<256){
                        for(j=0;j<256;j++){
                                for(k=0;k<256;k++){
                                        print $1,$6,$7,j,k;
                                }
                        }$7++;
                }
                $6++;
                while($6<$10){
                        for(l=0;l<256;l++)
                                for(m=0;m<256;m++){
                                        for(n=0;n<256;n++){
                                                print $1,$6,l,m,n;
                                        }
                                }
                        }
                }
                if($6==$10){
                        for(o=0;o<$11;o++){
                                for(p=0;p<256;p++){
                                        for(q=0;q<256;q++){
                                                print $1,$10,o,p,q;
                                        }
                                }
                        }
                        if(o==$11){
                                for(r=0;r<$12;r++){
                                        for(s=0;s<256;s++){
                                                print $1,$10,$11,r,s;
                                        }
                                }
                                if(r==$12){
                                        for(t=0;t<$13;t++){
                                                print $1,$10,$11,$12,t;
                                        }
                                }
                        }
                }
        }else if($10>$9){
                for(u=$9;u<$10;u++){
                        print $1,$6,$7,$8,u;
                }
        }else{
                print $1,$2,$3,$4,$5
        }
}

论坛徽章:
0
4 [报告]
发表于 2004-03-03 21:22 |只看该作者

用脚本如何实现这个功能? --SHELL高手的挑战

思路其实很简单,就是循环多了些,我想也没有别的好方法可用吧?

论坛徽章:
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
5 [报告]
发表于 2004-03-03 22:55 |只看该作者

用脚本如何实现这个功能? --SHELL高手的挑战

一个长句,试试^_^
  1. awk 'NF==2{split($2,a,",");for(x in a)if(split(a[x],b,"[.-]")<5)print $1,a[x];else for(i=b[4];i<=b[5];i++)print $1,b[1]"."b[2]"."b[3]"."i}' ipfile
复制代码

论坛徽章:
0
6 [报告]
发表于 2004-03-04 09:01 |只看该作者

用脚本如何实现这个功能? --SHELL高手的挑战

原帖由 "r2007"]  else for(i=b[4];i<=b[5];i++)print $1,b[1]"."b[2]"."b[3 发表:
"."i}' ipfile

这一句不妥,192.201.24.100,202.25.19.11 这段ip只有靠多重循环才行。

论坛徽章:
0
7 [报告]
发表于 2004-03-04 09:14 |只看该作者

用脚本如何实现这个功能? --SHELL高手的挑战

labrun:
  好象你的办法也不对嘛!

论坛徽章:
0
8 [报告]
发表于 2004-03-04 09:30 |只看该作者

用脚本如何实现这个功能? --SHELL高手的挑战

是哪方面?思路上还是执行上的错误?我没有试过,(现在没有环境)我觉得思路上是这样理解的。执行上肯定会有问题,最明显的就是awk 最后面少了一个’号,也可能还有我哪里写错的语句。呵呵,我是表达个思路,还是看看高手们的想法吧。

论坛徽章:
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
9 [报告]
发表于 2004-03-04 09:55 |只看该作者

用脚本如何实现这个功能? --SHELL高手的挑战

原帖由 "labrun" 发表:

这一句不妥,192.201.24.100,202.25.19.11 这段ip只有靠多重循环才行。

我试了,结果完全正确,没有发现问题,请labrun有机会试一下^_^

论坛徽章:
0
10 [报告]
发表于 2004-03-04 10:19 |只看该作者

用脚本如何实现这个功能? --SHELL高手的挑战

r007:

呵,对于网段可不行
eg:
njing 10.23.53.13,192.168.10.100-145
suzhou 192.201.12.32,192.201.24.100,202.25.19.11


结果为:
njing 192.168.10.100-145   --我要自动把网段的IP构造出来
njing 10.23.53.13
suzhou 192.201.24.100
suzhou 202.25.19.11
suzhou 192.201.12.32
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP