Zrobiłbym to za pomocą fpingi awk. Niestety, awk„s printfnie 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 -k3Jest opcjonalne, to po prostu grupy wyjście przez fpingwynik ( „nazwa hosta jest żywy”, „nazwa hosta jest nieosiągalny” lub „nazwa hosta: Nazwa lub usługa nie znane”). Bez tego sortnieznane hosty zawsze pojawią się jako pierwsze na wyjściu. Po prostu sortbez -k3sortowania 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.