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.
Uma abordagem de força bruta seria tentar todas as permutações de qualquer uma das duas listas até encontrar uma em que todos os pares de endereços IP estejam em sub-redes diferentes.
Usando o
Algorithm::Permute
módulo perl:O que aqui dá:
Apenas cinco valores na lista? Bem, são apenas 120 permutações, e há algumas dúzias aceitáveis, o que parece uma boa probabilidade...
Saída (um exemplo, por necessidade):
Imagino que você adivinhou o que
sort -R
faz. Acho que o código deve ser claro o suficiente. Sinto que deveria me desculpar por postar isso, mas... hum, não me sinto. Desculpe por isso.Embora isso eventualmente funcione, fazer uma busca determinística pode parecer um pouco mais sensato. Se você tem Python, há
itertools.permutations
para ajudar com isso. Então:e saída:
Não está claro por que a saída esperada deve ser aquela saída específica que você mostra em vez de algum outro conjunto de pares. Se você só quer pares de endereços IP junto
slaves
com aquelesmasters
com um valor de sub-rede diferente, então isso poderia ser o seguinte usando qualquer awk: