Я бы сделал это с 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"
). Затем вы можете посчитать количество строк и использовать его, чтобы решить, насколько широким должно быть поле счетчика строк.
Я также решил, что выходные данные различают неизвестные hosts ( CONNECTION IMPOSSIBLE
) и недоступные хосты ( CONNECTION FAIL
).
Опция sort -k3
необязательна, она просто группирует выходные данные по fping
результату («имя хоста живо», «имя хоста недоступно» или «имя хоста: имя или служба неизвестна»). Без этого sort
неизвестные хосты всегда будут появляться первыми в выходных данных. Просто sort
без -k3
сортировки по имени хоста.
$TOTAL (length) - $MASHINE (length)
чтобы получить количество точек. Затем используйтеprintf '.%.s' {1..$DOTS}
в каждой итерации цикла. Как-то так, думаю, сработает.