GNU/Linux >> Tutoriales Linux >  >> Linux

Uso del comando Bash printf para imprimir salidas formateadas

La forma más sencilla de imprimir en la línea de comandos de Linux es usando el comando echo.

echo "Value of var is $var"

Sin embargo, el comando echo no será adecuado cuando necesite imprimir una salida formateada.

Aquí es donde el comando printf te ayuda. El comando bash printf funciona como el comando printf en el lenguaje de programación C/C++.

printf "My brother %s is %d years old.\n" Prakash 21

¿Puedes adivinar la salida?

El primer argumento %s espera una cadena, %d espera un entero decimal, al igual que C/C++. No se preocupe si no está familiarizado con C/C++.

No necesita aprenderlo solo para usar el comando printf en sus scripts Bash. Déjame mostrarte algunos ejemplos del comando Bash printf.

Usando el comando Bash printf

Comencemos con la sintaxis primero.

printf format [arguments]

Aquí, format es una cadena que determina cómo se mostrarán los valores subsiguientes.

En el ejemplo printf "My brother %s is %d years old.\n" Prakash 21 , todo el formato "Mi hermano %s tiene %d años.\n" y va seguido de los argumentos Prakash y 21 . Los argumentos se usan para reemplazar los especificadores de formato (%s, %d, etc.) que explicaré más adelante en este artículo.

En su forma más simple, printf se puede usar como comando de eco para mostrar una cadena.

printf "Hello World\n"

Observe el carácter de nueva línea \n ¿al final? La diferencia entre el comando echo y printf es que echo agrega automáticamente un nuevo carácter de línea al final, pero para printf, debe agregarlo explícitamente.

Preste especial atención al tipo y número de argumentos

Tenga en cuenta que la cadena de formato intenta aplicarse a todos los argumentos. Es por esto que debes prestarle especial atención.

[email protected]:~$ printf "Hello, %s! \n" Abhishek Prakash
Hello, Abhishek! 
Hello, Prakash!

Del mismo modo, también debe prestar atención al tipo de especificador de formato que espera en la cadena de formato.

Como puede ver en el ejemplo anterior, si no encuentra los argumentos deseados, muestra los valores predeterminados, que es nulo para cadenas y 0 para números enteros.

printf "Hi %s, your room number is %d. \n" Abhishek Prakash 131
bash: printf: Prakash: invalid number
Hi Abhishek, your room number is 0. 
Hi 131, your room number is 0.

Aquí, se necesita Abhishek Prakash como primer conjunto de argumentos y 131 como segundo conjunto de argumentos.

Cuando encuentra una cadena (Prakash) en lugar de un número entero, se queja pero continúa mostrando la salida con el segundo argumento en su valor predeterminado 0.

De manera similar, ve 131 como cadena en el segundo conjunto de argumentos y dado que el segundo argumento está ausente, el valor predeterminado es 0.

Caracteres de especificación de formato

Hay varios especificadores de formato disponibles para que muestre su salida en el formato deseado. Estos son algunos de los más comunes:

Ahora que está familiarizado con el especificador de formato, veamos algunos ejemplos más que los muestran en acción.

Ejemplos de comando Bash printf

No creo que necesite una explicación detallada para la mayoría de estos ejemplos, ya que se explican por sí mismos.

[email protected]:~$ printf "The octal value of %d is %o\n" 30 30
The octal value of 30 is 36

Veamos el uso del %b especificador para interpretar correctamente el carácter de escape de barra invertida.

[email protected]:~$ printf "String with backslash: %s\n" "Hello\nWorld!"
String with backslash: Hello\nWorld!

Ves para %s , no hace ninguna diferencia. Pero con %b el carácter de escape de nueva línea se interpretará correctamente:

[email protected]:~$ printf "String with backslash: %b\n" "Hello\nWorld!"
String with backslash: Hello
World!

Cuando usas el %c , solo lee caracteres a la vez.

[email protected]:~$ printf "Character: %c\n" a
Character: a
[email protected]:~$ printf "Character: %c\n" a b c
Character: a
Character: b
Character: c
[email protected]:~$ printf "Character: %c\n" abc
Character: a

Uso de modificadores para mostrar la salida de printf en un estilo específico

Hay modificadores para cambiar el aspecto de la salida según su gusto.

# modificador para números octales y hexadecimales

Anteriormente viste el uso de %o para convertir decimal a octal. Sin embargo, no estaba muy claro que fuera un número octal. Puede usar el # modificador para mostrar números octales y hexadecimales en el formato adecuado.

[email protected]:~$ printf "%d is %#o in octal and %#x in hexadecimal\n" 30 30 30
30 is 036 in octal and 0x1e in hexadecimal

Modificador de espacio para enteros positivos

Puede usar un espacio entre % y d en %d para mostrar un entero positivo con un espacio inicial. Esto ayuda cuando tienes una columna de números positivos y negativos. Mira cuál se ve más 'bonita':

[email protected]:~$ printf "%d \n%d \n%d \n" 10 -10 10
10 
-10 
10 
[email protected]:~$ printf "% d \n%d \n% d \n" 10 -10 10
 10 
-10 
 10 

Modificador de ancho

El modificador de ancho es un número entero que especifica el ancho de campo mínimo del argumento.

Por defecto, está alineado a la derecha:

[email protected]:~$ printf "%10s| %5d\n" Age 23
       Age|    23

Puede alinearlo a la izquierda agregando - marcarlo:

[email protected]:~$ printf "%-10s| %-5d\n" Age 23
Age       | 23

Modificador de precisión

Puede usar el punto modificador de precisión (.) para especificar un número mínimo de dígitos que se mostrarán con %d , %u , %o , %x . Agrega cero relleno a la izquierda del valor.

[email protected]:~$ printf "Roll Number: %.5d\n" 23
Roll Number: 00023

Si usa el modificador de precisión con una cadena, especifica la longitud máxima de la cadena. Si la cadena es más larga, se trunca en la pantalla.

[email protected]:~$ printf "Name: %.4s\n" Abhishek
Name: Abhi

Puede combinar tanto el modificador de ancho como el de precisión:

[email protected]:~$ printf "Name: %.4s\n" Abhishek
Name: Abhi
[email protected]:~$ printf "Name: %10.4s\n" Abhishek
Name:       Abhi

Ejemplo adicional:muestra la salida en formato tabular con printf

Hagamos un buen uso de lo que ha aprendido sobre el comando printf con un ejemplo un poco más complicado. Esto mostrará el verdadero potencial del comando printf en scripts bash.

Usemos el comando printf para imprimir la siguiente tabla usando bash:

Personaje Uso
%s Cadena
%c Carácter único
%d Enteros
%o Enteros octales
%x Enteros hexadecimales
%f Coma flotante
%b Cadena con carácter de escape de barra invertida
%% Signo de porcentaje

Aquí está el script de shell que escribí para esta tarea. Su guión puede variar:

#/bin/bash
seperator=--------------------
seperator=$seperator$seperator
rows="%-15s| %.7d| %3d| %c\n"
TableWidth=37

printf "%-15s| %-7s| %.3s| %s\n" Name ID Age Grades
printf "%.${TableWidth}s\n" "$seperator"
printf "$rows" "Sherlock Holmes" 122 23 A
printf "$rows" "James Bond" 7 27 F
printf "$rows" "Hercules Poirot" 6811 59 G
printf "$rows" "Jane Marple" 1234567 71 C

Ahora, si ejecuto este script bash shell, esto es lo que imprime:

¿No es maravilloso usar el comando bash printf para imprimir una salida bellamente formateada para sus scripts?

Espero que les haya gustado este tutorial detallado sobre el comando printf en Linux. Si tiene preguntas o sugerencias, por favor hágamelo saber. Y no olvide convertirse en miembro del Manual de Linux para obtener más aprendizajes informativos sobre Linux.


Linux
  1. ¿Usando una referencia a una variable de cadena Bash en Sed?

  2. Usando el comando de suspensión de Linux en Bash Scripts

  3. Uso del comando Linux Basename en Bash Scripts

  4. Ejemplos del uso del comando tcpdump para solucionar problemas de red

  5. ¿Dividir la salida del comando por columnas usando Bash?

Consejos para usar el comando superior en Linux

Comando Bash printf

Bash Scripting - Comando Printf explicado con ejemplos

Usando el comando Dirname de Linux en Bash Scripts

Bash ignorando el error de un comando en particular

usando random para generar una cadena aleatoria en bash

    Nombre identificación Edad Calificaciones
    Sherlock Holmes 0000122 23 A
    James Bond 0000007 27 F
    Hércules Poirot 0006811 59 G
    Jane Marple 1234567 71 C