Acabo de escribir el siguiente script bash para verificar el acceso de ping en la lista de máquinas 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
Esto imprime:
(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
¿Cómo puedo usar printf
(o cualquier otro comando) en mi script bash para imprimir el siguiente formato?
(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
yael
fuente
fuente
$TOTAL (length) - $MASHINE (length)
para obtener el número de puntos. Luego, useprintf '.%.s' {1..$DOTS}
en cada iteración de bucle. Algo así creo que funcionará.Respuestas:
Usando la expansión de parámetros para reemplazar espacios resultantes de
%-s
puntos:fuente
%2d
está agregando un espacio innecesario dentro de los paréntesis (aunque podría ser útil cuando $ list> = 10); ii) para obtener la salida exacta del OP , es posible que desee agregarmachine_indented=${machine_indented/../ .}
para agregar un espacio adicional antes del primero.
. Como dije, pedante.for m in $list
es lazsh
sintaxis Enbash
eso estaríafor i in "${list[@]}"
.bash
no tiene operadores de relleno. Puede rellenarprintf
pero solo con espacios, no con caracteres arbitrarios.zsh
tiene operadores de relleno.El relleno de operador está
${(r:25:)parameter}
a la derecha -pad con una longitud de 25 o con espacios${(r:25::string:)parameter}
a la derecha -pad con cualquier cadena en lugar de espacio.También usamos
printf '%4s'
para dejar- pad(x)
con espacios. Podríamos haber usado en su${(l:4:):-"($((++c)))"}
lugar. Sin embargo, una diferencia notable es que si la cadena tiene más de 4 caracteres, la${(l)}
truncaría y se desbordaríaprintf
.fuente
El
%s
especificador de formato puede tomar una precisión (%.20s
por ejemplo), y al igual que cuando desea generar un valor flotante con una precisión determinada (con,%.4f
por ejemplo), la salida tendrá como máximo esa cantidad de caracteres del argumento de cadena dado.Así que cree una cadena que contenga el nombre de la máquina y suficientes puntos para quedarse sin puntos:
Salida:
fuente
Con cosas robadas de la respuesta de @ choroba:
fuente
Lo haría con
fping
yawk
. Por desgracia,awk
'sprintf
no se puede rellenar con puntos, sólo que con espacios o ceros así que tengo que escribir una función:Estoy usando números de 2 dígitos rellenados con ceros entre paréntesis para que el formato no se arruine si hay 10-99 hosts
$list
(100+ aún lo arruinarán). La alternativa sería retrasar la impresión hasta que unEND {}
bloque, y para los / de expresiones regulares-partidos / a sólo tiene que insertar el nombre de host en una de tres arrays, por ejemplook
,fail
,unknown
. o solo una matriz asociativa (por ejemplohosts[hostname]="OK"
). Luego podría contar el número de líneas y usarlo para decidir qué tan ancho debe ser el campo del contador de línea.También he decidido que la salida distinga entre hosts desconocidos (
CONNECTION IMPOSSIBLE
) y hosts inalcanzables (CONNECTION FAIL
).El
sort -k3
es opcional, solo agrupa la salida por elfping
resultado ("el nombre de host está vivo", "el nombre de host es inalcanzable" o "nombre de host: nombre o servicio desconocido"). Sin elsort
, los hosts desconocidos siempre aparecerán primero en la salida. Simplementesort
sin la-k3
voluntad ordenar por nombre de host.fuente