一款IP合并和分解工具

news2024/11/13 14:41:31

一:需求说明

         近期在工作中有个需求,需要将七千多个ip地址(有的带掩码,有的不带掩码)进行合并尝试,看能不能通过合并减少ip的条目数。这就涉及到ip和掩码的计算,举例如下:

192.168.1.0/25
192.168.1.128/29
192.168.1.136/30
192.168.1.140/32
192.168.1.141/32
192.168.1.142/31
192.168.1.144/28
192.168.1.160/27
192.168.1.192/29
192.168.1.200/30
192.168.1.204/31
192.168.1.206/32
192.168.1.207/32
192.168.1.208/28
192.168.1.224/27

如上的ip,我么可以先对其进行展开,直观的看到其ip地址范围

192.168.1.0-192.168.1.127
192.168.1.128-192.168.1.135
192.168.1.136-192.168.1.139
192.168.1.140
192.168.1.141
192.168.1.142-192.168.1.143
192.168.1.144-192.168.1.159
192.168.1.160-192.168.1.191
192.168.1.192-192.168.1.199
192.168.1.200-192.168.1.203
192.168.1.204-192.168.1.205
192.168.1.206
192.168.1.207
192.168.1.208-192.168.1.223
192.168.1.224-192.168.1.255

这里插一下怎么去展开地址,我们借助IPy模块去做展开

import os
import IPy
from ip_info import IPList

for ip in IPList:
    ipIns = IPy.IP(ip)
    print(ipIns.strFullsize(3))

        先把所有地址读到一个列表里,再遍历列表,用strFullsize方法进行展开,这里就不做详细介绍了,有兴趣的同学可以自行去code调试

        从上面的地址可以清除的看到所有地址合并就是192.168.1.0-192.168.1.255,可以直接用192.168.1.0/24一条去表示上面的所有条目。条目少我们可以手工计算的方式进行合并,但是如果有几千上万个ip条目手工计算就不太现实了。

        github上有一款ip合并和分解的工具cidr-merger,可以很好的解决咱们的需求

gituhub上的工程地址如下:GitHub - zhanhb/cidr-merger: A simple command line tool to merge ip/ip cidr/ip range, supports IPv4/IPv6A simple command line tool to merge ip/ip cidr/ip range, supports IPv4/IPv6 - GitHub - zhanhb/cidr-merger: A simple command line tool to merge ip/ip cidr/ip range, supports IPv4/IPv6https://github.com/zhanhb/cidr-merger

 其发行版本提供了linux版本,windowd版本,我们可以根据需要去下载对应的版本。这里我是在windows上使用。

二:工具使用

下面我们试用一下该款工具

1,查看工具使用帮助

2, IP 段分解为掩码形式

 3,IP段合并

 我们尝试去打乱顺序,并且加一条重复的ip,看工具能不能正确处理

192.168.1.136/30
192.168.1.140/32
192.168.1.0/25
192.168.1.128/29
192.168.1.140/32

 可以看到工具能很好的处理

那我们回到最上面的需求,我们将IP拷贝到ip.txt里去,用工具运行看下

 可以看到合并成了一条,我们可以通过-r参数以ip范围的方式输出,也可以通过-s以掩码的方式输出,如果我们输入的结果比较多,输出的结果也比较多,除了用重定向符号输出到文件,也可以通过-o参数,这样便于后续的程序处理

 4,官网示例

通过上面的参数可以看到该款工具还有很多其他的玩法,在此就不一一举例了,有些伙伴可能不能访问github,在这贴上官网的用例

$ echo '1.0.0.1-223.255.255.254' | cidr-merger
> 1.0.0.1
  1.0.0.2/31
  1.0.0.4/30
  1.0.0.8/29
  ......
  1.128.0.0/9
  2.0.0.0/7
  4.0.0.0/6
  8.0.0.0/5
  16.0.0.0/4
  32.0.0.0/3
  64.0.0.0/2
  128.0.0.0/2
  192.0.0.0/4
  208.0.0.0/5
  216.0.0.0/6
  220.0.0.0/7
  222.0.0.0/8
  223.0.0.0/9
  ......
  223.255.255.240/29
  223.255.255.248/30
  223.255.255.252/31
  223.255.255.254
$ echo '1.1.1.0' > a; \
    echo '1.1.1.1' > b; \
    echo '1.1.1.2/31' > c; \
    echo '1.1.1.3-1.1.1.7' > d; \
    cidr-merger -o merge a b c d; \
    cat merge; \
    rm a b c d merge
> 1.1.1.0/29
$ wget -O- "https://ftp.apnic.net/stats/apnic/`TZ=UTC date +%Y`/delegated-apnic-`TZ=UTC+24 date +%Y%m%d`.gz" | \
    gzip -d | awk -F\| '!/^\s*(#.*)?$/&&/CN\|ipv4/{print $4 "/" 32-log($5)/log(2)}' | \
    cidr-merger -eo/etc/chinadns_chnroute.txt # update ip on router
$ #              ^ e: means error if input is empty
$ echo 'fe80::/10' | cidr-merger -r
> fe80::-febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff
$ echo '1.1.1.0' > a; echo '1.1.1.1' | cidr-merger - a; rm a
$ #                                                ^ -: means standard input
> 1.1.1.0/31

 -r和-s输出的比较

$ echo '1.1.1.1/32' | cidr-merger
> 1.1.1.1
$ echo '1.1.1.1/32' | cidr-merger -s
> 1.1.1.1/32
$ echo '1.1.1.1/32' | cidr-merger -r
> 1.1.1.1
$ echo '1.1.1.1/32' | cidr-merger -rs
> 1.1.1.1-1.1.1.1

空策略的比较

$ cidr-merger -o txt /dev/null # an empty file named `txt` is created.
$ cidr-merger -ko txt /dev/null # no file is created, and this program exit with code zero
$ #            ^ same as `cat /dev/null | cidr-merger --skip-empty --output txt`
$ cidr-merger -eo txt /dev/null # no file is created, and this program exit with code non zero
$ #            ^ same as `cat /dev/null | cidr-merger --error-if-empty --output txt`
$ # option `-e` might be useful when download file from internet and then write to a file

$ # There is no difference if you redirect output to a file such as following
$ cat /dev/null | cidr-merger -e > txt
  # file `txt` is created, but this program exit with code non zero

 为方便小伙伴下载已上传到csdn:https://mp.csdn.net/mp_download/manage/download/UpDetailed

 后续如果有时间想设计一个可视化工具,通过可视化来展现这一款工具的能力

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/547791.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第四章 matlab的循环结构

循环(loop)是一种 matlab 结构,它允许我们多次执行一系列的语句。循环结构有两种 基本形式:while 循环和 for 循环。两者之间的最大不同在于代码的重复是如何控制的。在 while 循环中,代码的重复的次数是不能确定的,只要满足用户定义的条件,重复就进行下 去。相对地,在 fo…

前端uniapp+后端springboot 详细教程《实现微信小程序授权登录》(附完整前后端项目demo)

实现微信小程序授权登录 1、前端技术栈1.1、uniapp1.2、前端封装工具1.3、Hbuilderx构建uniapp项目 2、后端技术栈2.1、创建springboot后端项目2.2、数据库准备2.3、创建实体类2.4、后端工具类2.5、mapper和service接口2.5、Service实现类2.6、微信用户的控制层Controller 微信…

怎么将png转jpg在线处理?图片转换格式工具分享

做设计的小伙伴经常需要进行图片格式转换,但是下载安装软件比较耗费时间,操作起来也很不方便,今天就来介绍一个在线格式转换的方法,下面以png转jpg在线(https://www.yasuotu.com/geshi)处理为例子给大家演示…

基本的排序算法

一、插入排序 基本思想:在待排序的元素中,假设前面n-1(其中n>2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。按照此法对所有元素…

JVM内存模型概述

当谈到Java虚拟机(JVM)的内存模型时,我们需要了解JVM如何管理内存并执行Java应用程序。理解JVM的内存模型对于编写高效、可靠的Java代码至关重要。本文将介绍JVM的内存模型,并通过图示进行说明。 JVM内存模型概述 JVM内存模型定义…

5年自动化测试经验的一些感悟—愿测试进阶路上的你不在迷茫

作为一个测试人,我们或多或少都听过或用过自动化,我们都曾在初入测试行业时,满怀期待的以为测试的尽头是不用测试员点点了,项目一提测,小手点下自动化的开关,瞬间测试的工作就完成了。 这就是我一开始从开…

Python-增加b站视频播放量

前言 本文是该专栏的第1篇,后面会持续更新对应平台干货知识,记得关注。 需求背景和说明:实现获取真实播放量,以及增加播放量 废话不多说,跟着笔者直接往下看正文,在文中将结合代码进行详细说明。&#xf…

【数据结构】从数据结构角度深入探究队列

队列是计算机科学中的一种基本数据结构,用于存储和管理数据。在计算机程序中,队列被广泛应用于任务调度、进程管理等场景。本文将介绍队列的概念、特点、常见操作以及应用。 文章目录 队列的概念队列的应用队列的存储结构队列接口的实现队列的初始化队尾…

plt.plot(x,y,color,linestyle,marker)函数参数详解

一、plt.plot()函数详解 plt.plot()函数是matplotlib库中用于绘制线条图的函数,它有多个参数可以控制绘图的各个方面。以下是常用的一些参数及其作用: x: x轴数据的列表或数组y: y轴数据的列表或数组linewidth: 线条的宽度,从0到无穷大的浮…

( 动态规划) 115. 不同的子序列 ——【Leetcode每日一题】

❓115. 不同的子序列 难度:困难 给你两个字符串 s 和 t ,统计并返回在 s 的 子序列 中 t 出现的个数。 题目数据保证答案符合 32 位带符号整数范围。 示例 1: 输入:s “rabbbit”, t “rabbit” 输出:3 解释&…

智能变电站远程监控解决方案

智能变电站远程监控解决方案 一、项目背景 变电站是改变电压、控制和分配电能的场所,为了加强对变电站的监管力度,抓好供电作业的动态管理,及时、实时的掌握变电站的安全隐患的整改消除情况,确保安全生产贯穿于供电的全过程&…

如何禁用烦人的“insert”键

在我们日常的电脑使用中,有些按键可能会让我们感到非常烦恼,其中最常见的就是“insert”键。这个键位于键盘的右上角,通常会在我们不经意间被按下,导致我们的输入出现了一些奇怪的问题。如果你也曾经遇到过这个问题,那…

在网络安全领域中,主要有哪些技术方向?

入门Web安全、安卓安全、二进制安全、工控安全还是智能硬件安全等等,每个不同的领域要掌握的技能也不同。 当然入门Web安全相对难度较低,也是很多人的首选。主要还是看自己的兴趣方向吧。 本文就以下几个问题来说明网络安全大致学习过程👇 网…

Vue3项目初始配置(更新中ing)

文章目录 别名路径联想配置方法 element plus按需引入并使用风格定制 eslint文件名不强制检测编辑.eslintrc.cjs 别名路径联想 在编写代码的过程中,一旦 输入 / , VSCode会立刻 联想出src下的所有子目录和文件, 统一文件路径访问不容易出 配置方法 在项目的根目…

相亲交友App开发解决方案及功能框架

相亲APP开发功能 1、注册登录:相亲APP开发平台是一款真实的交友软件,所以需要用户提交身份信息进行注册认证,也是为了保障用户的安全! 2、搜索功能:在线、新注册、距离近、同城老乡、星族速配等,都可以在相亲APP内进行…

详解GitHub

详解GitHub 什么是GitHub?GitHub能干什么?1.托管代码、历史版本管理2.搜索开源项目3.分享的同时会得到社区的回馈4.使用Github Pages服务,你可以免费搭建一个博客网站5.学习,能力提升6.提升自己的影响力 GitHub和Git的关系与区别敲…

MySQL基础(三十八)数据库备份与恢复

1 物理备份与逻辑备份 物理备份:备份数据文件,转储数据库物理文件到某一目录。物理备份恢复速度比较快,但占用空间比较大,MySQL中可以用 xtrabackup 工具来进行物理备份。 逻辑备份:对数据库对象利用工具进行导出工作…

Android如何自定义输入文本对话框?

文章目录 0.引言1.创建示例工程2.输入文本对话框布局和功能设计3.主程序调用输入文本对话框 0.引言 笔者研究的课题涉及到安卓软件开发,在开发过程中,发现普通的显示消息对话框一般可以调用android自带包实现,而要通过文本框输入交互&#xf…

代码随想录算法训练营第十一天|20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

今天的题目都是对栈的经典应用。 有效的括号 题目链接:力扣 解题思路:基于栈结构的特殊性,其非常适合做对称匹配类问题,其实如果知道了要用栈解这道题,在脑中模拟一遍,接下来的思路就是自然而然能够想到…

STM32 多路ADC同时扫描采样

背景 在项目实际应用中,刚好有需求需要使用多路ADC同时采样,这里就选择STM32 ADC多路ADC同时采样,这里简单说明下配置过程,以及使用步骤 原理图 如下图所示,使用四路ADC输入 ADC_Voltage -> 电压信号的采样&…