bash - ejemplo - Personajes de relleno en printf
print bash linux (10)
Aqui hay otro más:
$ { echo JBoss DOWN; echo GlassFish UP; } | while read PROC STATUS; do echo -n "$PROC "; printf "%$((48-${#PROC}))s " | tr '' '' -; echo " [$STATUS]"; done
JBoss -------------------------------------------- [DOWN]
GlassFish ---------------------------------------- [UP]
Estoy escribiendo un script de shell bash para mostrar si un proceso se está ejecutando o no.
Hasta ahora, tengo esto:
printf "%-50s %s/n" $PROC_NAME [UP]
El código me da esta salida:
JBoss [DOWN]
GlassFish [UP]
verylongprocessname [UP]
Quiero rellenar el espacio entre los dos campos con un ''-'' o ''*'' para hacerlo más legible. ¿Cómo hago eso sin alterar la alineación de los campos?
El resultado que quiero es:
JBoss ------------------------------------------- [DOWN]
GlassFish --------------------------------------- [UP]
verylongprocessname ----------------------------- [UP]
Creo que esta es la solución más simple. Construcciones internas de shell puro, sin matemática en línea. Toma prestado de respuestas anteriores.
Solo subcadenas y la metavariable $ {# ...}.
A="[>---------------------<]";
# Strip excess padding from the right
#
B="A very long header"; echo "${A:0:-${#B}} $B"
B="shrt hdr" ; echo "${A:0:-${#B}} $B"
Produce
[>----- A very long header
[>--------------- shrt hdr
# Strip excess padding from the left
#
B="A very long header"; echo "${A:${#B}} $B"
B="shrt hdr" ; echo "${A:${#B}} $B"
Produce
-----<] A very long header
---------------<] shrt hdr
Este es aún más simple y no ejecuta comandos externos.
$ PROC_NAME="JBoss"
$ PROC_STATUS="UP"
$ printf "%-.20s [%s]/n" "${PROC_NAME}................................" "$PROC_STATUS"
JBoss............... [UP]
No hay forma de agregar nada más que espacios usando printf
. Puedes usar sed
:
printf "%-50s@%s/n" $PROC_NAME [UP] | sed -e ''s/ /-/g'' -e ''s/@/ /'' -e ''s/-/ /''
Pure Bash. Use la longitud del valor de ''PROC_NAME'' como desplazamiento para la cadena ''línea'' fija:
line=''----------------------------------------''
PROC_NAME=''abc''
printf "%s %s [UP]/n" $PROC_NAME "${line:${#PROC_NAME}}"
PROC_NAME=''abcdef''
printf "%s %s [UP]/n" $PROC_NAME "${line:${#PROC_NAME}}"
Esto da
abc ------------------------------------- [UP]
abcdef ---------------------------------- [UP]
Si está terminando los caracteres del panel en un número de columna fijo, puede sobreimprimir y cut
a la longitud:
# Previously defined:
# PROC_NAME
# PROC_STATUS
PAD="--------------------------------------------------"
LINE=$(printf "%s %s" "$PROC_NAME" "$PAD" | cut -c 1-${#PAD})
printf "%s %s/n" "$LINE" "$PROC_STATUS"
Solución trivial (pero funcional):
echo -e "---------------------------- [UP]/r$PROC_NAME "
Pure Bash, sin utilidades externas
Esta demostración tiene una justificación completa, pero puede omitir restar la longitud de la segunda cadena si quiere líneas irregulares.
pad=$(printf ''%0.1s'' "-"{1..60})
padlength=40
string2=''bbbbbbb''
for string1 in a aa aaaa aaaaaaaa
do
printf ''%s'' "$string1"
printf ''%*.*s'' 0 $((padlength - ${#string1} - ${#string2} )) "$pad"
printf ''%s/n'' "$string2"
string2=${string2:1}
done
Desafortunadamente, la longitud de la cuerda de la almohadilla debe estar codificada, pero la longitud del almohadillado puede ser una variable como se muestra.
Salida:
a--------------------------------bbbbbbb
aa--------------------------------bbbbbb
aaaa-------------------------------bbbbb
aaaaaaaa----------------------------bbbb
Sin restar la longitud de la segunda cadena:
a---------------------------------------bbbbbbb
aa--------------------------------------bbbbbb
aaaa------------------------------------bbbbb
aaaaaaaa--------------------------------bbbb
La primera línea podría ser el equivalente (similar a sprintf
):
printf -v pad ''%0.1s'' "-"{1..60}
Puede imprimir todo en una línea si lo prefiere:
printf ''%s%*.*s%s/n'' "$string1" 0 $((padlength - ${#string1} - ${#string2} )) "$pad" "$string2"
usando solo el echo
El guion de @Dennis Williamson está funcionando bien, excepto que estaba tratando de hacer esto usando el eco. Echo permite enviar charcacters con un cierto color. El uso de printf eliminaría ese color e imprimiría caracteres ilegibles. Aquí está el echo
alternativa:
string1=abc
string2=123456
echo -en "$string1 "
for ((i=0; i< (25 - ${#string1}); i++)){ echo -n "-"; }
echo -e " $string2"
salida:
abc ---------------------- 123456
por supuesto, puede usar todas las variaciones propuestas por @Dennis Williamson si quiere que la parte correcta esté alineada a la izquierda oa la derecha (reemplazando 25 - ${#string1}
por 25 - ${#string1} - ${#string2}
etc ...
echo -n "$PROC_NAME $(printf ''/055%.0s'' {1..40})" | head -c 40 ; echo -n " [UP]"
Explicación:
-
printf ''/055%.0s'' {1..40}
- Crea 40 guiones
(el guion se interpreta como una opción, así que use el código ascii escapado en su lugar) -
"$PROC_NAME ..."
- Concatenar $ PROC_NAME y guiones -
| head -c 40
| head -c 40
- Recortar cuerda a los primeros 40 caracteres