Eu faria isso com fping
e awk
. Infelizmente, awk
não é printf
possível preencher com pontos, apenas com espaços ou zeros, então eu tenho que escrever uma função:
list=(kali surya indra ganesh durga hanuman nonexistent)
fping "${list[@]}" 2>&1 |
sort -k3 |
awk -F'[: ]' 'BEGIN { fmt="(%02d) %s CONNECTION %s\n"};
function dotpad(s,maxlen, l,c,pads) {
l = maxlen - length(s);
pads = "";
for (c=0;c<l;c++) {pads=pads"."};
return s " " pads
};
/alive$/ { printf fmt, ++i, dotpad($1,19), "OK" };
/unreachable$/ { printf fmt, ++i, dotpad($1,19), "FAIL" }
/not known$/ { printf fmt, ++i, dotpad($1,19), "IMPOSSIBLE" } '
(01) durga .............. CONNECTION OK
(02) ganesh ............. CONNECTION OK
(03) indra .............. CONNECTION OK
(04) kali ............... CONNECTION OK
(05) nonexistent ........ CONNECTION IMPOSSIBLE
(06) hanuman ............ CONNECTION FAIL
(07) surya .............. CONNECTION FAIL
Estou usando números de 2 dígitos preenchidos com zero entre parênteses, para que o formato não seja estragado se houver 10-99 hosts $list
(mais de 100 ainda estragam tudo). A alternativa seria a atrasar a impressão até que um END {}
bloco de, e para as partidas / EXPREG-/ a inserção apenas o nome da máquina em uma das três matrizes, por exemplo ok
, fail
, unknown
. ou apenas uma matriz associativa (por exemplo hosts[hostname]="OK"
). Depois, você pode contar o número de linhas e usá-lo para decidir a largura do campo do contador de linhas.
Também decidi fazer a saída distinguir entre hosts desconhecidos ( CONNECTION IMPOSSIBLE
) e hosts inacessíveis ( CONNECTION FAIL
).
A sort -k3
é opcional, apenas grupos a saída pelo fping
resultado ( "hostname está vivo", "hostname é inacessível" ou "hostname: Nome ou serviço desconhecido"). Sem o sort
, os hosts desconhecidos sempre aparecerão primeiro na saída. Simplesmente sort
sem a -k3
vontade ordenar por nome de host.
$TOTAL (length) - $MASHINE (length)
para obter o número de pontos. Em seguida, useprintf '.%.s' {1..$DOTS}
em cada iteração de loop. Algo assim acho que vai funcionar.