Eu faria isso com fping
e awk
. Infelizmente, awk
' printf
não pode preencher com pontos, apenas com espaços ou zeros, então 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 dois dígitos zerados entre parênteses para que o formato não seja danificado se houver 10 a 99 hosts em $list
(100+ ainda vai estragar tudo). A alternativa seria atrasar a impressão até um bloco END {}
, e para o / regexp-matches / apenas inserir o nome do host em um dos três arrays, por exemplo ok
, fail
, unknown
. ou apenas um array associativo (por exemplo, hosts[hostname]="OK"
). Então, você poderia contar o número de linhas e usá-las para decidir a largura do campo do contador de linhas.
Eu também decidi fazer a saída distinguir entre hosts desconhecidos ( CONNECTION IMPOSSIBLE
) e hosts inacessíveis ( CONNECTION FAIL
).
O sort -k3
é opcional, apenas agrupa a saída pelo resultado fping
("nome do host está ativo", "nome do host inacessível" ou "nome do host: Nome ou serviço desconhecido"). Sem o sort
, os hosts desconhecidos sempre aparecerão primeiro na saída. Apenas sort
sem o -k3
irá classificar por hostname.