Blog del Podcast
podcast      GitHub      Twitter   Telegram

No todo es echo. También existe printf

Tiempo estimado de lectura: 9 minutos. 1078 palabras. bash

Cuando hacemos scritps en bash, habitualmente utilizamos echo para imprimir o mostrar el resultado a través de la terminal. Si es un resultado simple, en principio no hay ningún problema. Los problemas vienen cuando utilizamos comillas dobles, simples, comillas dentro de una variable, etc… para poder previsualizar sin errores, necesitamos dar escape a las comillas. Esto no es del todo simple y puede frustrar. Para solucionar este problema, podemos utilizar printf.

Iniciandonos con printf

printf es mucho mas simple que echo, vamos a comenzar con algunos simples ejemplos:

$ printf "Hola Mundo"
Hola Mundo

Salto de línea

Del mismo modo que echo, podemos hacer salto de líneas. Vamos a ver varios ejemplos:

$ printf "%s\n" "Hola Mundo"
Hola Mundo
$ printf "Hola \nMundo"
Hola
Mundo
$ printf "%s\n" "Hola" "Mundo"
Hola
Mundo
$ printf "%*s\n" $(tput cols) "Hola Mundo!"
Hola
Mundo
!

Imprimir al final de la línea

Ahora vamos a desplazar la línea al final del margen derecho:

$ printf "%*s\n" $(tput cols) "Hola Mundo!"

                                 Hola Mundo!

Llamada de Fechas, host, rutas

Podemos llamar diferentes formatos de fecha, host, rutas,…

$ printf 'Esta es la semana %(%U/%Y)T.\n' -1
Esta es la semana 05/2019.

Mostrando la fecha y host:

$ printf "%s:%s\n" "$(date)" "$(hostname)"
vie feb  8 22:16:26 CET 2019:angel

Ruta de mi carpeta home:

$ printf "La ruta de mi home es %s.\n" $HOME
La ruta de mi home es /home/angel.

Añadiendo el nombre con el que nos hemos logeado en la sesión:

$ printf "Hola, Soy %s.\n" $LOGNAME
Hola, Soy angel.

Fecha y hora:

$ printf "%(%m-%d-%Y %H:%M:%S)T\n" $(date +%s)
02-08-2019 21:10:35

Tabla con el código del formato de fecha:

Código de Formato Descripción
%% un% literal
%a el nombre abreviado del día de la semana de locale (por ejemplo, Lun)
%A el nombre completo del día laborable de la localidad (por ejemplo, domingo)
%b el nombre abreviado del mes de la localidad (por ejemplo, enero)
%B el nombre completo del mes del local (por ejemplo, enero)
%c Fecha y hora del local (por ejemplo, jue 3 de marzo 23:05:25 2005)
%C siglo; como% Y, excepto omitir los últimos dos dígitos (por ejemplo, 20)
%d día del mes (por ejemplo, 01)
%D fecha; igual que% m /% d /% y
%e día del mes, espacio acolchado; igual que% _d
%F fecha completa igual que% Y-% m-% d
%g los dos últimos dígitos del año del número de semana ISO (ver% G)
%G año del número de semana ISO (ver% V); Normalmente útil solo con% V
%h igual que% b
%H hora (00..23)
%I hora (01..12)
%j día del año (001..366)
%k hora, espacio rellenado (0..23); igual que% _H
%l hora, espacio acolchado (1..12); igual que% _I
%m mes (01..12)
%M minuto (00..59)
%n una nueva linea
%N nanosegundos (000000000..999999999)
%p el equivalente local de AM o PM; en blanco si no se conoce
%P como% p, pero minúscula
%q trimestre del año (1..4)
%r el reloj de 12 horas del local (por ejemplo, 11:11:04 PM)
%R Hora y minuto de 24 horas; igual que% H:% M
%s segundos desde 1970-01-01 00:00:00 UTC
%S segundo (00..60)
%t una pestaña
%T hora; igual que% H:% M:% S
%u día de la semana (1..7); 1 es lunes
%U Número de la semana del año, con el domingo como primer día de la semana (00..53)
%V Número de semana ISO, con el lunes como primer día de la semana (01..53)
%w día de la semana (0..6); 0 es domingo
%W Número de la semana del año, con el lunes como primer día de la semana (00..53)
%x Representación de la fecha de la localidad (por ejemplo, 31/12/99)
%X Representación del tiempo del local (por ejemplo, 23:13:48)
%y los dos últimos dígitos del año (00..99)
%Y año
%z + hhmm zona horaria numérica (por ejemplo, -0400)
%:z + hh: mm zona horaria numérica (por ejemplo, -04: 00)
%::z + hh: mm: ss zona horaria numérica (por ejemplo, -04: 00: 00)
%:::z zona horaria numérica con: a la precisión necesaria (por ejemplo, -04, +05: 30)
%Z abreviatura alfabética de la zona horaria (por ejemplo, EDT)

Editar texto

Cortar Texto:

$ printf "%.*s" 12 "Muestra solo las cinco primeras letras"
Muestra solo
$ printf "Me llamo \"%s\".\nEs un placer conocerte." "Angel"
Me llamo "Angel".
Es un placer conocerte.

Indentado:

$ printf "%*s\n" 25 "Hola Mundo"

               Hola Mundo

Números

$ printf "2 + 2 son %d\n" $((2+2))
2 + 2 son 4
$ printf "Aquí en solo %d pondremos estos %d valores.\n\ndoble salto de línea" 1 2

Aquí en solo 1 pondremos estos 2 valores.

doble salto de línea

Creando 2 columnas:

$ printf "%-10d %-10d\n" 1 500 2 550

1          500       
2          550

Conclusión

Como podéis ver, printf tiene muchísimas posibilidades y aquí solo he descrito unas pocas. Si os soy sincero, soy un clásico y tiro por comandos como date y echo. Pero lo que si que es cierto, que si llegas a un momento de desesperación con las comillas en un script, printf es una gran solución.

Fuentes


Publicado por Angel el Friday 08 February del 2019



También te puede interesar:




Powered by org-bash-blog

Written in OrgMode with Emacs and converted to HTML with Pandoc

Licencia de Creative Commons
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional.