Я б це зробив з 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}в кожному циклі ітерацію. Щось подібне, я думаю, спрацює.