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.
printf es mucho mas simple que echo, vamos a comenzar con algunos simples ejemplos:
$ printf "Hola Mundo"
Hola Mundo
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
!
Ahora vamos a desplazar la línea al final del margen derecho:
$ printf "%*s\n" $(tput cols) "Hola Mundo!"
Hola Mundo!
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) |
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
$ 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
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.
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
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional.