Я только что написал следующий скрипт bash, чтобы проверить доступ ping к списку машин Linux:
for M in $list
do
ping -q -c 1 "$M" >/dev/null
if [[ $? -eq 0 ]]
then
echo "($C) $MACHINE CONNECTION OK"
else
echo "($C) $MACHINE CONNECTION FAIL"
fi
let C=$C+1
done
Это печатает:
(1) linux643 CONNECTION OK
(2) linux72 CONNECTION OK
(3) linux862 CONNECTION OK
(4) linux12 CONNECTION OK
(5) linux88 CONNECTION OK
(6) Unix_machinetru64 CONNECTION OK
Как я могу использовать printf
(или любую другую команду) в моем скрипте bash, чтобы напечатать следующий формат?
(1) linux643 ............ CONNECTION OK
(2) linux72 ............. CONNECTION OK
(3) linux862 ............ CONNECTION OK
(4) linux12 ............. CONNECTION OK
(5) linux88 ............. CONNECTION FAIL
(6) Unix_machinetru64 ... CONNECTION OK
bash
shell-script
printf
Яэль
источник
источник
$TOTAL (length) - $MASHINE (length)
чтобы получить количество точек. Затем используйтеprintf '.%.s' {1..$DOTS}
в каждой итерации цикла. Как-то так, думаю, сработает.Ответы:
Использование раскрытия параметров для замены пробелов, полученных в результате
%-s
точек:источник
%2d
добавление лишних пробелов в скобках (хотя это может быть полезно, когда $ list> = 10); II), чтобы получить точный вывод ОП , вы можете добавить,machine_indented=${machine_indented/../ .}
чтобы добавить дополнительный пробел перед первым.
. Как я уже сказал, педантичный.for m in $list
этоzsh
синтаксис. Вbash
этом было быfor i in "${list[@]}"
.bash
не имеет операторов заполнения. Вы можете выполнять заполнение,printf
но только с пробелами, а не с произвольными символами.zsh
имеет операторы заполнения.Обивка оператор
${(r:25:)parameter}
с правой -pad с длиной 25 с пробелами или${(r:25::string:)parameter}
к правой -pad с любой строкой вместо пространства.Мы также используем
printf '%4s'
для левой -pad(x)
пробелов. Мы могли бы использовать${(l:4:):-"($((++c)))"}
вместо этого. Однако заметное отличие состоит в том, что если длина строки превышает 4 символа, она${(l)}
будет обрезана, а при ее переполненииprintf
.источник
Спецификатор
%s
формата может иметь точность (%.20s
например), и точно так же, как если вы хотите вывести значение с плавающей точкой с определенной точностью (%.4f
например, с), вывод будет не более того количества символов из данного строкового аргумента.Поэтому создайте строку, которая содержит имя компьютера и количество точек, достаточное для исчерпания точек:
Вывод:
источник
С вещами, украденными из ответа @ choroba:
источник
Я бы сделал это с
fping
иawk
. К сожалению,awk
«Sprintf
не может подушечка с точками, только с пробелами или нулями , так что я должен написать функцию:Я использую двузначные числа с нулями в круглых скобках, чтобы формат не облажался, если в нем 10-99 хостов
$list
(100+ все равно облажаются). Альтернативы можно было бы отложить до тех пор , печать наEND {}
блоке, и для / регулярных выражений матчей / просто вставить имя хоста в одном из трех массивов, напримерok
,fail
,unknown
. или только один ассоциативный массив (напримерhosts[hostname]="OK"
). Затем вы можете посчитать количество строк и использовать его, чтобы решить, насколько широким должно быть поле счетчика строк.Я также решил, что выходные данные различают неизвестные hosts (
CONNECTION IMPOSSIBLE
) и недоступные хосты (CONNECTION FAIL
).Опция
sort -k3
необязательна, она просто группирует выходные данные поfping
результату («имя хоста живо», «имя хоста недоступно» или «имя хоста: имя или служба неизвестна»). Без этогоsort
неизвестные хосты всегда будут появляться первыми в выходных данных. Простоsort
без-k3
сортировки по имени хоста.источник