作为参考,这是使用 shell 将组 IP 地址分配到不同子网的后续操作和变体
我们有两个字符串(名为 master/slave),这两个字符串由分布在三个子网中的 IPS 组成。只需将这两个字符串分成对,其中每对中的两个地址位于不同的 /24 子网中。以下是示例:
主/从服务器均有 5 个 IPS,分布在 3 个子网中
172.28.250/172.28.154/172.28.254
。
masters='172.28.250.99 172.28.250.101 172.28.154.41 172.28.154.52 172.28.254.30'
slaves='172.28.250.103 172.28.250.104 172.28.154.53 172.28.254.32 172.28.254.33'
最终输出将创建如下对:左侧来自从属设备,右侧来自主设备,并且对于每一对,前三个部分是不同的,因为172.28.154.53 => 172.28.250.99 ,172.28.154
不同于172.28.250
输出不是唯一的,我们想要的只是在不同的子网中设置主/从
172.28.154.53 → 172.28.250.99
172.28.250.103 → 172.28.154.41
172.28.250.104 → 172.28.254.30
172.28.254.32 → 172.28.250.101
172.28.254.33 → 172.28.154.52
我已经尝试了 Stephane 建议的代码,如下所示,我们可以将所有 ip 推送到哈希中并进行配对以生成映射,但输出将使来自 master 的一个 ip 与来自 master 的另一个 ip 匹配,这不是预期的输出
perl -e '
push @{$s{s/\.\d+$//r}}, $_ for @ARGV;
@l = values %s;
for ($n = @ARGV; $n > 0; $n -= 2) {
@l = sort {@$b <=> @$a} @l;
printf "%s %s\n", pop(@{$l[0]}), pop(@{$l[1]});
}' $masters $slaves
使用此代码输出是
172.28.250.104 172.28.254.33
172.28.250.103 172.28.154.53
172.28.250.101 172.28.154.52
172.28.254.32 172.28.250.99
172.28.254.30 172.28.154.41
我们可以172.28.250.103 172.28.154.53
从大师那里看到,这不是我们所需要的。
一种强力的方法是尝试两个列表中任一个的所有排列,直到找到所有 IP 地址对都在不同子网中的列表。
使用
Algorithm::Permute
perl 模块:这里给出的是:
列表中只有 5 个值?好吧,那只有 120 个排列,而且有几十个可以接受的排列,这听起来是个不错的几率……
输出(作为示例,有必要):
我想你已经猜到
sort -R
了。我认为代码应该足够清晰了。我觉得我应该为发布这个感到抱歉,但是……嗯,我没有。对此我很抱歉。虽然这最终会奏效,但进行确定性搜索可能会感觉更明智一些。如果你有 Python,它可以
itertools.permutations
帮助实现这一点。所以:并输出:
不清楚为什么预期输出应该是您显示的特定输出,而不是其他一些对。如果您只想要 IP 地址对
slaves
以及具有masters
不同子网值的 IP 地址对,那么使用任何 awk 都可以这样做: