Para referência, este é um acompanhamento e variação do endereço IP do grupo para diferentes sub-redes com shell
Temos duas strings (chamadas master/slave), as duas strings são compostas com IPS espalhadas em três sub-redes. Só precisamos fazer as duas strings em pares onde os dois endereços em cada par estão em diferentes sub-redes /24. O seguinte é um exemplo:
Tanto o mestre quanto o escravo têm cinco IPS e estão distribuídos em três sub-redes
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'
A saída final criará pares como abaixo: o lado esquerdo é dos escravos, o lado direito é dos mestres e, para cada par, as três primeiras seções são diferentes, pois 172.28.154.53 => 172.28.250.99 ,172.28.154
é diferente de172.28.250
A saída não é única, o que queremos é apenas tornar mestre/escravo em sub-redes diferentes
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
E eu tentei o código como Stephane sugeriu como abaixo, podemos colocar todos os ips em hash e fazer o par gerar um mapa, mas a saída fará com que um ip do mestre corresponda a outro do mestre, esta não é a saída esperada
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
Com este código a saída é
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
Podemos ver 172.28.250.103 172.28.154.53
ambos nos mestres, mas não é disso que precisamos.