Aprende leyendo en orden

Salida y reportes — escribir con printf y here-doc

Este artículo forma parte del Curso de Linux, con el que dominarás desde cero habilidades prácticas de Linux, desde los comandos básicos hasta los scripts de shell.
Alinea columnas con printf '%s\t%s\n', añade resultados con > y >>, separa los errores con 2> e incrusta $(wc -l) en una plantilla here-doc para construir un reporte de agregación, ilustrado y practicado en una terminal del navegador.

Dar formato a la salida — printf y hacia dónde va

Para que el resultado de un script se lea bien, eliges entre echo, que imprime una cadena tal cual, y printf, que toma un formato y alinea anchos y separadores.

Si solo quieres el valor de una variable en una línea, con echo "$v" basta.

Escribe printf '%s\t%s\n' name age y los argumentos entran en orden en los huecos %s, \t se convierte en un tabulador y \n en un salto de línea.

A diferencia de echo, printf no añade el salto de línea por ti, así que escribe siempre \n al final de la línea.

La salida de un comando llega por dos canales: la salida estándar y el error estándar.

> file sobrescribe un archivo con la salida estándar, >> file añade al final y 2> file envía solo el error estándar a un archivo aparte.

Envía los resultados correctos al reporte y los errores a su propio archivo y rastrear una causa después será mucho más fácil.

vi fmt.sh   # abrir en el editor, escribir lo siguiente y guardar con :wq
#   #!/bin/sh
#   printf '%s\t%s\n' name age      # encabezado separado por tabuladores
#   printf '%s\t%s\n' alice 30      # fila de datos, alineada
#   echo "done" >> fmt.log           # añadir al log
chmod +x fmt.sh
./fmt.sh
Hacia dónde va la salida
resultado normalsalida estándar> sobrescribe>> añadeerrorerror estándar2> err.loghacia el reportelos errores a su propio archivo
Los resultados normales van al reporte con > (sobrescribir) o >> (añadir), y los errores se desvían a otro archivo con 2>.
SintaxisSignificadoEjemplo
echo "$v"Imprimir una variable o una cadena tal cualecho "$name"
printf "%s\t%s\n" a bImprimir con un formato (separador de tabulador y salto de línea explícito)printf '%s\t%s\n' name age
> fSobrescribir un archivo con la salida estándarecho line > report.txt
>> fAñadir la salida estándar a un archivoecho more >> report.txt
2> errDesviar solo el error estándar a otro archivocat missing 2> err.log

Construye y ejecuta un script que imprima con formato y redirija la salida a donde corresponde.

① Abre format.sh con vi format.sh, presiona i para entrar en modo de inserción, escribe la parte que imprime con formato y la que escribe el reporte, y guarda con Esc:wq (puedes copiar el cuerpo del panel de respuesta y pegarlo).

② Añade permiso de ejecución con chmod +x format.sh.

③ Ejecútalo con ./format.sh y comprueba en pantalla la salida con formato.

④ Comprueba con cat table.txt el contenido del reporte que escribiste. (Ejecútalo correctamente y aparecerá la explicación).

Linux console
0 / 4 completado(s)
Loading Linux Terminal...

Reunir un reporte de agregación en un solo archivo — here-doc y sustitución de comandos

Para un reporte con un formato fijo, escribe la plantilla como here-doc y incrusta dentro los resultados de los comandos.

Las líneas que escribes entre cat > report.txt <<EOF … EOF pasan al archivo tal cual, y donde escribes $(...) se expande ahí mismo el resultado de ejecutar ese comando.

Un <<EOF sin comillas expande variables y sustituciones de comandos; <<'EOF' (con comillas simples) no expande nada e imprime el texto literal.

Captura los valores agregados, como conteos y sumas, con wc -l o grep -c dentro de una sustitución de comandos.

Una vez escrito el reporte, informa a quien lo llamó de si el trabajo salió bien, con un código de exit.

exit 0 significa éxito y exit 1 significa que algo falló, y un && posterior o una tarea de CI pueden actuar en consecuencia.

vi summary.sh   # abrir en el editor, escribir lo siguiente y guardar con :wq
#   #!/bin/sh
#   log=access.log
#   lines=$(wc -l < "$log")          # contar las líneas
#   cat > summary.txt <<REPORT       # incrustar el valor en la plantilla
#   --- access summary ---
#   total lines: $lines
#   REPORT
#   echo "summary.txt created"
#   exit 0
chmod +x summary.sh
Incrustar un resultado agregado en un here-doc
access.logcontar con $(wc -l)total = 5<<EOF … EOFincrustar $totalreport.txt listototalizarincrustar en la plantilla
El valor contado por $(wc -l) se incrusta en el punto $(...) de la plantilla here-doc, reuniéndolo todo en un solo reporte.
SintaxisSignificadoEjemplo
<<EOF … EOFhere-doc que expande variables y sustituciones de comandoscat <<EOF > t.txt
<<'EOF' … EOFhere-doc que no expande nada e imprime el texto literalcat <<'EOF' > t.txt
$(wc -l < f)Capturar un valor agregado con sustitución de comandosn=$(wc -l < access.log)
exit 0 / exit 1Devolver un código de salida de éxito o de falloexit 0

Calcula los totales de un log, incrústalos en una plantilla here-doc y reúne el reporte en un solo archivo.

① Crea un archivo de ejemplo con printf 'GET /a 200\nGET /b 404\nGET /c 200\nGET /d 500\nGET /e 200\n' > access.log.

② Abre report.sh con vi report.sh y presiona i para entrar en modo de inserción. Escribe la lógica que calcula los totales con sustitución de comandos y los incrusta en una plantilla here-doc, y guarda con Esc:wq (puedes copiar el cuerpo del panel de respuesta y pegarlo).

③ Añade permiso de ejecución con chmod +x report.sh.

④ Ejecútalo con ./report.sh y comprueba con cat report.txt los valores agregados y la plantilla del report.txt generado.

Linux console
0 / 3 completado(s)
Loading Linux Terminal...

Separar la salida estándar y los errores en archivos distintos

Cuando un mismo comando produce resultados correctos y errores a la vez, escribe > ok.txt 2> err.txt y la salida estándar se guarda en ok.txt mientras el error estándar va a err.txt.

Como después puedes revisar los resultados y los problemas por separado, esta forma aparece mucho al diseñar el registro de los scripts de mantenimiento.

ls /etc /no_such_dir > ok.txt 2> err.txt   # el listado a ok.txt, el error a err.txt
cat ok.txt                                  # el listado de /etc (salida estándar)
cat err.txt                                 # el error de /no_such_dir (error estándar)
Separar los dos canales de un mismo comando
ls /etc /no_suchok.txt(resultados)err.txt(problemas)> salida estándar2> error estándar
La salida estándar de un mismo comando puede ir a > ok.txt y su error estándar a 2> err.txt, guardados por separado al mismo tiempo.
SintaxisSignificadoEjemplo
cmd > ok 2> errEnviar la salida estándar y el error estándar a archivos distintos a la vezls /etc > ok.txt 2> err.txt
echo "…" 1>&2Enviar un mensaje al canal de error estándarecho failed 1>&2

Construye y ejecuta un script que redirija la salida estándar y los errores de un mismo comando a archivos distintos.

① Abre split.sh con vi split.sh, presiona i para entrar en modo de inserción, escribe la lógica que redirige la salida estándar y los errores a archivos distintos, y guarda con Esc:wq (puedes copiar el cuerpo del panel de respuesta y pegarlo).

② Añade permiso de ejecución con chmod +x split.sh.

③ Ejecútalo con ./split.sh y comprueba en pantalla el número de líneas de ok.txt y err.txt.

④ Comprueba el contenido de la salida estándar con cat ok.txt y el de los errores con cat err.txt.

Linux console
0 / 5 completado(s)
Loading Linux Terminal...
QUIZ

Verificación de conocimientos

Responde cada pregunta una a una.

Pregunta 1En printf '%s\t%s\n' a b, ¿qué significan \t y \n?

Pregunta 2¿Qué sintaxis redirige solo el error estándar de un comando a un archivo aparte?

Pregunta 3Cuando quieres incrustar el resultado de $(...) dentro de una plantilla here-doc, ¿qué etiqueta de apertura usas?