Zrobiłbym to za pomocą fping
i awk
. Niestety, awk
„s printf
nie może pad z kropek, tylko ze spacji lub zera, więc muszę napisać funkcję:
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
Używam w nawiasach 2-cyfrowej liczby zero-padded, aby format nie został zepsuty, jeśli jest 10-99 hostów $list
(100+ nadal je zepsuje ). Alternatywą byłoby opóźnić drukowanie aż w END {}
bloku i na / regexp-meczów / po prostu włóż hosta do jednej z trzech tablic, na przykład ok
, fail
, unknown
. lub tylko jedna tablica asocjacyjna (np hosts[hostname]="OK"
.). Następnie możesz policzyć liczbę linii i użyć jej do określenia, jak szerokie powinno być pole licznika linii.
Zdecydowałem także, aby w wyniku rozróżniać nieznane hosty ( CONNECTION IMPOSSIBLE
) i nieosiągalne hosty ( CONNECTION FAIL
).
sort -k3
Jest opcjonalne, to po prostu grupy wyjście przez fping
wynik ( „nazwa hosta jest żywy”, „nazwa hosta jest nieosiągalny” lub „nazwa hosta: Nazwa lub usługa nie znane”). Bez tego sort
nieznane hosty zawsze pojawią się jako pierwsze na wyjściu. Po prostu sort
bez -k3
sortowania posortowane według nazwy hosta.
$TOTAL (length) - $MASHINE (length)
aby uzyskać liczbę kropek. Następnie użyjprintf '.%.s' {1..$DOTS}
w każdej iteracji pętli. Myślę, że coś takiego zadziała.