<Anterior | Contenido | Siguiente>
printf - Formatear e imprimir datos
A diferencia de los otros comandos de este capítulo, el Printf El comando no se usa para tuberías (no acepta entrada estándar) ni encuentra aplicaciones frecuentes directamente en la línea de comando (se usa principalmente en scripts). Entonces, ¿por qué es importante? Porque es muy utilizado.
printf (de la frase "con formato de impresión") se desarrolló originalmente para el lenguaje de programación C y se ha implementado en muchos lenguajes de programación, incluido el shell. De hecho, en bash, printf es un archivo incorporado.
printf funciona así:
printf "formato" argumentos
El comando recibe una cadena que contiene una descripción de formato que luego se aplica a una lista de argumentos. El resultado formateado se envía a la salida estándar. Aquí hay un ejemplo trivial:
[yo @ linuxbox ~] $ printf "Formateé la cadena:% s \ n" foo
Formateé la cadena: foo
[yo @ linuxbox ~] $ printf "Formateé la cadena:% s \ n" foo
Formateé la cadena: foo
La cadena de formato puede contener texto literal (como "Formateé la cadena:"), secuencias de escape (como \n, un carácter de nueva línea), y secuencias que comienzan con el % personaje, que se llama especificaciones de conversión. En el ejemplo anterior, la especificación de conversión %s se utiliza para formatear la cadena "foo" y colocarla en la salida del comando. Aquí está de nuevo:
[yo @ linuxbox ~] $ printf "Formateé '% s' como una cadena. \ n" foo
Formateé 'foo' como una cadena.
[yo @ linuxbox ~] $ printf "Formateé '% s' como una cadena. \ n" foo
Formateé 'foo' como una cadena.
Como podemos ver, el %s La especificación de conversión se reemplaza por la cadena "foo" en la salida del comando. La conversión s se utiliza para formatear datos de cadena. Hay otros especificadores para otros tipos de datos. Esta tabla enumera los tipos de datos más utilizados:
Tabla 21-4: Especificadores de tipo de datos de printf comunes
Descripción del especificador
Descripción del especificador
d Formatee un número como un entero decimal con signo.
f Formatee y genere un número de coma flotante.
o Formatee un entero como un número octal.
s Formatea una cadena.
x Formatee un entero como un número hexadecimal utilizando minúscula af cuando sea necesario.
X Igual que x pero use letras mayúsculas.
% Imprime un símbolo% literal (es decir, especifica "%%")
Demostraremos el efecto de cada uno de los especificadores de conversión en la cadena "380":
[yo @ linuxbox ~] $ printf "% d,% f,% o,% s,% x,% X \ n" 380 380 380 380
380 380
380, 380.000000, 574, 380, 17c, 17C
[yo @ linuxbox ~] $ printf "% d,% f,% o,% s,% x,% X \ n" 380 380 380 380
380 380
380, 380.000000, 574, 380, 17c, 17C
Dado que especificamos seis especificadores de conversión, también debemos proporcionar seis argumentos para
printf para procesar. Los seis resultados muestran el efecto de cada especificador.
Se pueden agregar varios componentes opcionales al especificador de conversión para ajustar su salida. Una especificación de conversión completa puede constar de lo siguiente:
%[banderas][anchura][.precisión] especificación_conversión
Múltiples componentes opcionales, cuando se utilizan, deben aparecer en el orden especificado anteriormente para ser interpretados correctamente. Aquí hay una descripción de cada uno:
Tabla 21-5: Componentes de la especificación de conversión de printf
Descripción de Componente
Descripción de Componente
banderas Hay cinco banderas diferentes:
# - Utilice el "formato alternativo" para la salida. Esto varía según el tipo de datos. Para la conversión o (número octal), la salida tiene el prefijo
0. Para las conversiones x y X (número hexadecimal), la salida tiene el prefijo 0x o 0X respectivamente.
0– (cero) Rellene la salida con ceros. Esto significa que el campo se rellenará con ceros a la izquierda, como en "000380".
- - (guión) Alinear a la izquierda la salida. De forma predeterminada, printf alinea la salida a la derecha.
'' - (espacio) Produce un espacio inicial para números positivos.
+ - (signo más) Firmar números positivos. De forma predeterminada, solo printf
firma números negativos.
ancho Un número que especifica el ancho mínimo del campo.
.precisión Para números de coma flotante, especifique el número de dígitos de precisión que se emitirán después del punto decimal. Para la conversión de cadenas, precisión especifica el número de caracteres que se van a generar.
A continuación, se muestran algunos ejemplos de diferentes formatos en acción:
Tabla 21-6: Ejemplos de especificaciones de conversión de impresión
Argumento | Formato | Resultado | Notas |
380 | "%D" | 380 | Formateo simple de un |
entero. | |||
380 | "%#X" | 0x17c | Entero formateado como |
número hexadecimal usando | |||
la bandera de "formato alternativo". | |||
380 | "% 05d" | 00380 | Entero formateado con |
ceros a la izquierda (relleno) | |||
y un ancho de campo mínimo | |||
de cinco caracteres. | |||
380 | "% 05.5f" | 380.00000 | Número formateado como |
número de coma flotante con | |||
relleno y cinco decimales | |||
lugares de precisión. Ya que | |||
el mínimo especificado | |||
el ancho del campo (5) es menor que | |||
el ancho real de la | |||
número formateado, el | |||
el acolchado no tiene ningún efecto. | |||
380 | "% 010.5f" | 0380.00000 | Al aumentar el |
ancho de campo mínimo a 10 | |||
el relleno ahora es visible. | |||
380 | "% + d" | +380 | La + bandera firma un positivo |
número. | |||
380 | "%-D" | 380 | La bandera - a la izquierda alinea |
formateo |
abcdefghijk | "% 5s" | abcedfghijk | Una cadena formateada con un ancho de campo mínimo. |
abcdefghijk | "% .5s" | abcde | Al aplicar precisión a una cadena, se trunca. |
Una vez más, Printf se usa principalmente en scripts donde se emplea para formatear datos tabulares, en lugar de en la línea de comando directamente. Pero aún podemos mostrar cómo se puede usar para resolver varios problemas de formato. Primero, generemos algunos campos separados por caracteres de tabulación:
[yo @ linuxbox ~] $ printf "% s \ t% s \ t% s \ n" str1 str2 str3
cadena1 cadena2 cadena3
[yo @ linuxbox ~] $ printf "% s \ t% s \ t% s \ n" str1 str2 str3
cadena1 cadena2 cadena3
Insertando \t (la secuencia de escape de una pestaña), logramos el efecto deseado. A continuación, algunos números con un formato ordenado:
[yo @ linuxbox ~] $ printf "Línea:% 05d% 15.3f Resultado:% + 15d \ n" 1071 3.14156295 32589
Línea: 01071 3.142 Resultado: +32589
[yo @ linuxbox ~] $ printf "Línea:% 05d% 15.3f Resultado:% + 15d \ n" 1071 3.14156295 32589
Línea: 01071 3.142 Resultado: +32589
Esto muestra el efecto del ancho de campo mínimo en el espaciado de los campos. O qué tal formatear una pequeña página web:
[yo @ linuxbox ~] $ printf " \Nuevo Testamento \ n \ t \ t %s \norte
\ t \Nuevo Testamento \ n \ t \ t %s \Nuevo Testamento \norte \ n "" Título de la página "" Contenido de la página "
Título de la página
Meditative Healing™
Contenido de página
[yo @ linuxbox ~] $ printf " \Nuevo Testamento \ n \ t \ t %s \norte
\ t \Nuevo Testamento \ n \ t \ t %s \Nuevo Testamento \norte \ n "" Título de la página "" Contenido de la página "
Título de la página
Meditative Healing™
Contenido de página