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
%-spuntos:fuente
%2destá 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 $listes lazshsintaxis Enbasheso estaríafor i in "${list[@]}".bashno tiene operadores de relleno. Puede rellenarprintfpero solo con espacios, no con caracteres arbitrarios.zshtiene 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
%sespecificador de formato puede tomar una precisión (%.20spor ejemplo), y al igual que cuando desea generar un valor flotante con una precisión determinada (con,%.4fpor 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
fpingyawk. Por desgracia,awk'sprintfno 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 -k3es opcional, solo agrupa la salida por elfpingresultado ("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. Simplementesortsin la-k3voluntad ordenar por nombre de host.fuente