Я б це зробив з fping
і awk
. На жаль, awk
«S printf
не може подушечка з точками, тільки з пробілами або нулями , так що я повинен написати функцію:
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
Я використовую нумеровані двоцифрові цифри в круглих дужках, щоб формат не накручувався, якщо в ньому є 10-99 хостів $list
(100+ все одно його викручують). Альтернативи можна було б відкласти до тих пір , друк на END {}
блоці, і для / регулярних виразів матчів / просто вставити ім'я хоста в одному з трьох масивів, наприклад ok
, fail
, unknown
. або лише один асоціативний масив (наприклад hosts[hostname]="OK"
). Тоді ви могли порахувати кількість рядків і скористатися нею, щоб визначити, якою шириною має бути поле лічильника ліній.
Я також вирішив розрізняти вихідні дані між невідомими хостами ( CONNECTION IMPOSSIBLE
) та недоступними хостами ( CONNECTION FAIL
).
sort -k3
Чи не є обов'язковим, це просто групи вихід в fping
результаті ( «ім'я хоста живий», «ім'я хоста недосяжний» або «ім'я хоста: Ім'я або служба не відомі»). Без цього sort
, невідомі хости завжди з'являться першими у висновку. Просто звичайно sort
без -k3
сортування за іменем хоста.
$TOTAL (length) - $MASHINE (length)
щоб отримати кількість крапок. Потім використовуйтеprintf '.%.s' {1..$DOTS}
в кожному циклі ітерацію. Щось подібне, я думаю, спрацює.