Úselo printf
para formatear la salida (también es más portátil queecho
). También almacenaría el valor real de las secuencias de escape de color en lugar de almacenarlas en una forma que requiera expansión echo
.
RED=$(tput setaf 1) GREEN=$(tput setaf 2) YELLOW=$(tput setaf 3)
NC=$(tput sgr0)
online="${GREEN}online$NC" offline="${RED}offline$NC"
ping -c 1 "$hostname" > /dev/null 2>&1 && state=$online || state=$offline
printf 'Network %-15s: %s\n' "$hostname" "$state"
%-15s
es una especificación de formato que rellena las cadenas con espacios a la derecha para que la longitud (en número de caracteres en zsh
y fish
y bytes en la mayoría de los demás shells / printf ) sea de al menos 15.
$ printf '|%-4s|\n' a ab abc abcd abcde
|a |
|ab |
|abc |
|abcd|
|abcde|
printf '|%4s|\n' a ab abc abcd abcde
| a|
| ab|
| abc|
|abcd|
|abcde|
Con truncamiento:
$ printf '|%.4s|\n' a ab abc abcd abcde
|a|
|ab|
|abc|
|abcd|
|abcd|
$ printf '|%4.4s|\n' a ab abc abcd abcde
| a|
| ab|
| abc|
|abcd|
|abcd|
$ printf '|%-4.4s|\n' a ab abc abcd abcde
|a |
|ab |
|abc |
|abcd|
|abcd|
Otras utilidades para formatear texto en columnas incluyen POSIXexpand
:
printf 'Network %s\t: %s\n' "$hostname" "$state" | expand -t 30
(aquí expandiendo el carácter TAB ( \t
) con tabulaciones cada 30 columnas)
O BSDcolumn
o POSIXpr
:
printf 'Network %s\n: %s\n' "$hostname" "$state" | pr -at2
(aquí se imprime en 2 columnas de 36 columnas de ancho (vea la -w
opción para cambiar el ancho de página del valor predeterminado de 72)).
o BSDrs
:
{
while...
printf 'Network %s\n: %s\n' "$hostname" "$state"
done
} | rs -e 0 2
(como column
no comenzará a salir hasta que haya leído toda la entrada).
O GNUcolumns
:
printf 'Network %s\n: %s\n' "$hostname" "$state" | columns -w 25 -c 2
zsh
también tiene algunos indicadores de expansión de parámetros para el relleno de cadena: ${(l:15:)hostname}
para el relleno izquierdo y ${(r:15:)hostname}
para el relleno derecho (con truncamiento). En la expansión rápida (como en las solicitudes o en print -P
o como habilitado en las expansiones de parámetros con el %
indicador), también admite %F{green}
la salida de color, por lo que puede hacer:
online='%F{green}online%f'
printf '%s\n' "Network ${(r:15:)hostname}: ${(%)online}"
O:
print -rP "Network ${(r:15:)hostname}: $online"
Aunque el contenido de $hostname
entonces también estaría sujeto a una rápida expansión, lo que constituiría una vulnerabilidad de inyección de comando si el contenido de $hostname
no estuviera bajo su control (como en hostname='%<a[`reboot`]<'
)
column
(un comando BSD, también portado a Linux y encontrado por defecto en algunas distribuciones, que no debe confundirse con GNUcolumns
) necesitará leer toda la entrada antes de que pueda comenzar a generar algo, ya que necesita calcular el ancho de las columnas en función en el más anchoActualice su secuencia de comandos para insertar un número establecido en
\t
(pestañas) donde desee tabular a una columna.Mostrar algo similar a lo siguiente le daría la alineación requerida:
fuente
printf 'Network %s\t: Online\n' 8.8.8.8 192.168.122.123
no se alinean correctamente. Podría solucionarlo utilizandoexpand
para expandir las pestañas con un tabulador diferente como se muestra en mi respuesta.Para mostrar incluso mejor que @Roman
Luego agregue
\t
cada línea para dividirla en una columna.fuente