我正在使用Ruby NetAddr :: Tree类来保存一堆CIDR对象,但我需要一种方法将CIDR对象压缩为更大的子网。
我想要一种方法来获取IP:
12.26.8.0/21
12.26.16.0/21
12.26.24.0/21
12.26.32.0/21
12.26.40.0/21
12.27.152.0/21
并合并树中的相关地址范围,以便输出如下:
12.26.8.0/21
12.26.16.0/20
12.26.32.0/20
12.27.152.0/21
我查看了文档,但找不到任何方法来执行此操作。如果需要,我很高兴不再使用NEtAddr :: Tree,重要的是它需要一个IP /网络掩码字符串列表,合并它们并逐行输出。
答案 0 :(得分:3)
你看过NetAddr::merge吗?
来自文档:
给定CIDR地址或NetAddr :: CIDR对象的列表,以尽可能最有效的方式合并(汇总)它们。仅当新创建的超网不会导致“创建”新IP空间时,才会发生摘要。例如,以下块(192.168.0.0/24,192.168.1.0/24和192.168.2.0/24)将汇总到192.168.0.0/23和192.168.2.0/24而不是192.168.0.0/22中。 p>
require 'netaddr'
require 'pp'
pp NetAddr.merge(
%w[
12.26.8.0/21
12.26.16.0/21
12.26.24.0/21
12.26.32.0/21
12.26.40.0/21
12.27.152.0/21
].map{ |ip| NetAddr::CIDR.create(ip) }
)
=> ["12.26.8.0/21", "12.26.16.0/20", "12.26.32.0/20", "12.27.152.0/21"]