Lo farei con fping
e awk
. Sfortunatamente, awk
non è printf
possibile 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 fping
risultato ( "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 sort
senza l' -k3
ordinamento 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à.