tab print ejemplo bash shell printf

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