免费注册 查看新帖 |

Chinaunix

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

大侠们进来帮忙处理下IP集合的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-16 11:36 |只看该作者 |倒序浏览
如下格式的一个文件ip.txt
10.1
10.1.36.53
10.2
10.2.68
10.2.69
10.2.70
10.2.71
10.2.72
10.2.73
10.2.74
10.2.75
10.2.76
10.2.85
10.3
58.65.203
59.42.177.60
59.44.117.196
59.44.117.205
60.28.14.44

现在想把他变成
10.1
10.2
10.3
58.65.203
59.42.177.60
59.44.117.196
59.44.117.205
60.28.14.44

大概的意思就是如何某个ip段已经存在,那么属于这个IP段的单独的ip就可以删除
用脚本该如何实现,  大侠们出招啦.......................先谢过了 ^_^

论坛徽章:
71
15-16赛季CBA联赛之同曦
日期:2018-08-23 15:41:42辰龙
日期:2014-08-15 09:07:43狮子座
日期:2014-06-03 13:55:33亥猪
日期:2014-06-02 11:17:08巨蟹座
日期:2014-05-06 10:02:03午马
日期:2014-05-04 08:18:27亥猪
日期:2014-04-29 11:11:32技术图书徽章
日期:2014-04-24 15:51:26技术图书徽章
日期:2014-04-17 11:01:53辰龙
日期:2014-04-15 12:45:46亥猪
日期:2014-04-11 09:06:23射手座
日期:2014-04-01 15:28:10
2 [报告]
发表于 2008-06-16 11:42 |只看该作者
59.44.117.196
59.44.117.205
是怎么回事?

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
3 [报告]
发表于 2008-06-16 11:43 |只看该作者
awk -F. '{if(NF==2){a[$0]++;print}else{if(!($1"."$2 in a))print}}' ip.txt

论坛徽章:
0
4 [报告]
发表于 2008-06-16 12:07 |只看该作者
原帖由 ly5066113 于 2008-6-16 11:43 发表
awk -F. '{if(NF==2){a[$0]++;print}else{if(!($1"."$2 in a))print}}' ip.txt


HOHO,这个基本符合了,前提是要排好序吧?
再提个问题,如何IP段是类似于10.1.25这样子的呢? 又该怎么办?
如:
10.1.25
10.1.25.3
10.1.25.121
10.1.25.158
变成
10.1.25

谢谢了先

论坛徽章:
0
5 [报告]
发表于 2008-06-16 12:09 |只看该作者
原帖由 king_boss 于 2008-6-16 12:07 发表


HOHO,这个基本符合了,前提是要排好序吧?
再提个问题,如何IP段是类似于10.1.25这样子的呢? 又该怎么办?
如:
10.1.25
10.1.25.3
10.1.25.121
10.1.25.158
变成
10.1.25

谢谢了先


呵呵,我知道了, 再加一个管道就可以啦:) hoho
awk -F. '{if(NF==2){a[$0]++;print}else{if(!($1"."$2 in a))print}}' ip.txt  | awk -F. '{if(NF==3){a[$0]++;print}else{if(!($1"."$2"."$3 in a))print}}'

论坛徽章:
0
6 [报告]
发表于 2008-06-16 14:18 |只看该作者
原帖由 ly5066113 于 2008-6-16 11:43 发表
awk -F. '{if(NF==2){a[$0]++;print}else{if(!($1"."$2 in a))print}}' ip.txt

这里面的a[$0]和a分别是代表?

论坛徽章:
11
金牛座
日期:2015-03-19 16:56:22数据库技术版块每日发帖之星
日期:2016-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-04-24 06:20:00数据库技术版块每日发帖之星
日期:2016-04-13 06:20:00IT运维版块每日发帖之星
日期:2016-04-13 06:20:00数据库技术版块每日发帖之星
日期:2016-02-03 06:20:00数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00季节之章:春
日期:2015-03-27 15:54:57羊年新春福章
日期:2015-03-27 15:54:37戌狗
日期:2015-03-19 16:56:41数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
7 [报告]
发表于 2008-06-16 14:36 |只看该作者
这个IP段的定义太广了点吧....
10.16
10.17
也可能是10网段撒的....这得指定到什么位置...

论坛徽章:
0
8 [报告]
发表于 2008-06-16 16:07 |只看该作者

  1. sort -t. -n -1 +2 -2 +3 -3 +4 -4 数据文件 | awk '{i=1;ip=$1
  2. while(i<NF){if(ip in a)break;i++;ip=ip "." $i;}
  3. if(i==NF){a[$0]=1}
  4. }
  5. END{for(i in a) print i}'  | sort -t. -n -1 +2 -2 +3 -3 +4 -4
复制代码

用sort对数据文件排序,是考虑到数据有可能不是按照IP的大小来排序的,如果文件本身是排序好的,就不用sort了,直接用cat 数据文件
因为用for(i in a)罗列的方式来输出,会乱序,因此用sort来进行排序,这样就按照从小到大的顺序排列了

解释:
用.作为分隔符,用数据a来保存唯一的IP段,从左到右,分别用IP的部分数据来比对,如果在数组a中没有记录,就把它保存到数组中,最后再输出唯一的IP段。

论坛徽章:
0
9 [报告]
发表于 2008-06-16 20:55 |只看该作者

回复 #8 springwind426 的帖子

不错,学习之...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP