Lo farei con fpinge awk. Sfortunatamente, awknon è printfpossibile eseguire il pad con i punti, solo con spazi o zero, quindi devo scrivere una funzione:
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
Sto usando numeri a 2 cifre con spaziatura zero tra parentesi in modo che il formato non venga rovinato se ci sono 10-99 host $list(100+ lo rovineranno comunque). L'alternativa sarebbe di ritardare la stampa fino a quando un END {}blocco, e per i / regexp-partite / a basta inserire il nome host in una di tre array, per esempio ok, fail, unknown. o solo un array associativo (ad es hosts[hostname]="OK".). Quindi puoi contare il numero di linee e usarlo per decidere quanto deve essere ampio il campo del contatore di linee.
Ho anche deciso di distinguere l'output tra host sconosciuti ( CONNECTION IMPOSSIBLE) e host non raggiungibili ( CONNECTION FAIL).
Il sort -k3é opzionale, solo gruppi l'uscita dal fpingrisultato ( "hostname è vivo", "hostname non è raggiungibile" o "nome host: Nome o servizio non conosciuto"). Senza il sort, gli host sconosciuti appariranno sempre per primi nell'output. Semplicemente sortsenza l' -k3ordinamento per nome host.
$TOTAL (length) - $MASHINE (length)per ottenere il numero di punti. Quindi utilizzareprintf '.%.s' {1..$DOTS}in ogni iterazione del ciclo. Qualcosa del genere penso che funzionerà.