ip排序

620阅读 0评论2015-11-23 sync_1521
分类:LINUX

需求:将一段文本里面的所有IP按段的形式表现出来
如192.168.1.1 192.168.1.2 192.168.1.3 表示成 192.168.1.1..3
不同的段之间用逗号分隔,如:192.168.1.1..3,172.16.4.1..120   
  1. test@server:/tmp> cat file
  2. 18.11.11.11 peer upgrade172.16.1.123 peer upgrade172.16.1.128 peer upgrade172.16.1.140 peer upgrade172.16.1.141 peer upgrade172.16.1.205 peer upgrade192.168.1.206 peer upgrade192.168.1.4 peer upgrade192.168.10.4 peer upgrade
最终得到的文本为
18.11.11.11..11,172.16.1.123..123,172.16.1.128..128,172.16.1.140..141,172.16.1.205..205,192.168.1.206..206,192.168.1.4..4,192.168.10.4..4

代码:
  1. test@server:/tmp> cat -n file
  2.      1 18.11.11.11 peer upgrade172.16.1.123 peer upgrade172.16.1.128 peer upgrade172.16.1.140 peer upgrade172.16.1.141 peer upgrade172.16.1.205 peer upgrade192.168.1.206 peer upgrade192.168.1.4 peer upgrade192.168.10.4 peer upgrade

  3. test@server:/tmp>grep -oP "(\d{1,3}\.){3}\d{1,3}" file|sort -t"." -n -k1 -k2 -k3 -k4|awk 'BEGIN{FS=".";ORS=","}{if(gensub(/[0-9]*$/,"","g")!=net||($4-last)!=1){if(net){print net first".."last};net=gensub(/[0-9]*$/,"","g");first=$4};last=$4}END{printf net first".."last"\n"}'
  4. 18.11.11.11..11,172.16.1.123..123,172.16.1.128..128,172.16.1.140..141,172.16.1.205..205,192.168.1.206..206,192.168.1.4..4,192.168.10.4..4
解析:
1.grep -oP "(\d{1,3}\.){3}\d{1,3}" file 将file中的ip提取出来
  1. [root@test]# grep -oP "(\d{1,3}\.){3}\d{1,3}" file
  2. 18.11.11.11
  3. 172.16.1.123
  4. 172.16.1.128
  5. 172.16.1.140
  6. 172.16.1.141
  7. 172.16.1.205
  8. 192.168.1.206
  9. 192.168.1.4
  10. 192.168.10.4
2.sort -t"." -n -k1 -k2 -k3 -k4 将IP 排序
  1. [root@test 1123]# grep -oP "(\d{1,3}\.){3}\d{1,3}" file|sort -t"." -n -k1 -k2 -k3 -k4
  2. 18.11.11.11
  3. 172.16.1.123
  4. 172.16.1.128
  5. 172.16.1.140
  6. 172.16.1.141
  7. 172.16.1.205
  8. 192.168.1.206
  9. 192.168.1.4
  10. 192.168.10.4
但是这里面的第8行和第9行排序有问题,暂时未找到解决办法。。(sort -t"." --k1,1 -k2,2 -k3,3 -k4,4)
3.awk语句的总体思想就是排序后逐个读入IP,比较前三个字段和第四个字段,只要前三个字段不同或者第四个字段的差值大于1就打印IP段。





上一篇:命令行的艺术
下一篇:Redis未授权访问漏洞