Aprende leyendo en orden

Reporte de resumen de logs — argumentos, funciones y comandos combinados

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.
Recibe el log objetivo con log=${1:-access.log}, totalízalo con un bucle for más grep -c y awk '{sum+=$1}', y ciérralo todo con un reporte here-doc y un código de salida, ilustrado y practicado en una terminal del navegador.

Reunir las piezas en un solo script — el esqueleto de un reporte de resumen de logs

Todo lo que has aprendido hasta aquí — variables, parámetros posicionales ($1), condicionales ([ ] e if), bucles (for / while), funciones (name() { } y local), lectura de la entrada (while read … done < file), integración de comandos ($(...)) y salida (>> y here-doc) — se junta ahora en un solo script práctico.

El tema es el más habitual en producción: un reporte de resumen de logs.

Un script práctico recibe como argumentos el log objetivo y un umbral, comprueba la entrada, calcula los totales, reúne los resultados en un reporte y termina devolviendo un código de salida.

Para la agregación, combina comandos como grep para los conteos, awk para las sumas y sed para el formato; llevar el trabajo repetido a funciones y bucles lo mantiene legible.

Cuando un parámetro posicional viene vacío, complétalo con el predeterminado ${1:-access.log}.

vi mini.sh   # abrir en el editor, escribir lo siguiente y guardar con :wq
#   #!/bin/sh
#   log=${1:-access.log}              # predeterminado si no se pasa argumento
#   count_status() {                  # función que devuelve el conteo de un código de estado
#     grep -c " $1\$" "$log"
#   }
#   if [ ! -f "$log" ]; then          # comprobación de la entrada
#     echo "not found: $log" >&2
#     exit 1
#   fi
#   for s in 200 403 500; do          # totalizar por código de estado
#     echo "$s : $(count_status $s)"
#   done
#   exit 0
chmod +x mini.sh
Cómo fluye un script práctico
recibir argumentos$1 log / $2 limitcomprobar entrada[ -f "$log" ]función de agregacióngrep / awk juntoswhile readlínea por líneahere-docsalida del reporteexit 0 / 1éxito o fallo① Preparar② Totalizar③ Generar la salida
Constrúyelo en este orden: recibir los argumentos → comprobar la entrada → totalizar (combinando comandos) → escribir el reporte → devolver el código de salida.
ElementoDónde se usa en este scriptEjemplo
Variable name=...Tener en un solo sitio el nombre del log, el destino y el umbrallog=${1:-access.log}
Argumento $1 / ${1:-predet}Recibir el log objetivo y el umbral desde la línea de comandoslimit=${2:-1}
Condición [ -f f ] / ifComprobar que el log existe y determinar si se supera el umbralif [ ! -f "$log" ]; then exit 1; fi
Bucle for / while readTotalizar por código de estado y leer línea por líneafor s in 200 403 500; do … done
Función name() { … }Agrupar la agregación bajo un nombre y reutilizarlacount_status() { grep -c " $1\$" "$log"; }
Lectura de entrada while read … < fLeer el log línea por línea y contar por URLwhile read line; do … done < "$log"
Integración $(grep -c …) / awkCapturar conteos y sumas con sustitución de comandosn=$(grep -c ' 500$' "$log")
Salida >> / here-docEscribir los valores agregados como un reporte de formato fijocat > "$out" <<REPORT … REPORT

Construye y ejecuta un script de agregación que reúna argumentos, condicionales, funciones, bucles e integración de comandos.

① Crea un archivo de ejemplo con printf '12 GET /home 200\n34 GET /login 200\n5 GET /admin 403\n88 GET /api 500\n7 GET /home 200\n21 POST /api 500\n' > access.log.

② Abre summary.sh con vi summary.sh y presiona i para entrar en modo de inserción. Escribe la lógica de agregación que reúne argumentos, condicionales, funciones, bucles e integración de comandos, y guarda con Esc:wq (puedes copiar el cuerpo del panel de respuesta y pegarlo).

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

④ Ejecútalo con ./summary.sh y comprueba en pantalla la agregación por código de estado. (Ejecútalo correctamente y aparecerá la explicación).

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

Leer la entrada y cerrar con la integración — while read junto a grep / awk / sed

El trabajo fino, línea por línea, se hace con while read line; do … done < file.

Combina eso dentro de una función con grep para filtrar cada línea, awk para totalizar columnas y sed para uniformar el formato, y podrás reutilizar la lógica de agregación como un componente.

Añade un formateo como sed 's/^GET /[GET] /' y el reporte mantiene un aspecto uniforme.

Para terminar, incrusta los valores agregados en un reporte fijo con un here-doc, añade un aviso y devuelve exit 1 cuando se supere el umbral, o devuelve exit 0 cuando todo esté bien.

Recibe el segundo argumento como umbral con ${2:-100} y compara números como en if [ "$err" -gt "$limit" ], y tendrás un reporte con diagnóstico que puedes usar en producción.

El cierre es combinar el `grep` / `awk` / `sed` que aprendiste en los fundamentos con las estructuras de control de un script de shell.

vi scan.sh   # abrir en el editor, escribir lo siguiente y guardar con :wq
#   #!/bin/sh
#   log=${1:-access.log}
#   limit=${2:-1}
#   err=$(grep -c ' 500$' "$log")     # obtener el conteo de 500 con integración
#   while read line; do                # leer línea por línea
#     echo "$line" | sed 's/^/log: /'  # dar formato e imprimir
#   done < "$log"
#   if [ "$err" -gt "$limit" ]; then   # comprobar contra el umbral
#     echo "WARN: too many 500"; exit 1
#   fi
#   exit 0
chmod +x scan.sh
Leer la entrada junto a grep / awk / sed
while read line< access.logleer líneapor líneagrep / awk / sedfiltrar, totalizary dar formatohere-doc +if con umbralreporte +exit 0 / 1① Leer línea por línea② Totalizar en conjunto③ Decidir y generar el reporte
while read va tomando las líneas de una en una, y combinarlas con grep / awk / sed las convierte en un reporte con diagnóstico.

Recibe la entrada y un umbral, y cierra con un reporte que lleva diagnóstico, usando while read junto a grep / awk / sed.

① Crea un archivo de ejemplo con printf '12 GET /home 200\n34 GET /login 200\n5 GET /admin 403\n88 GET /api 500\n7 GET /home 200\n21 POST /api 500\n' > access.log.

② Abre audit.sh con vi audit.sh y presiona i para entrar en modo de inserción. Escribe la lógica del reporte que combina while read con grep / awk / sed y añade un diagnóstico, y guarda con Esc:wq (puedes copiar el cuerpo del panel de respuesta y pegarlo).

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

④ Ejecútalo con argumentos, como en ./audit.sh access.log 1, y comprueba el report.txt generado y el diagnóstico en pantalla.

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

Decidir el resultado según un umbral pasado como argumento — agregación y códigos de salida juntos

Junta en un solo script la recepción de argumentos y la agregación de la primera parte con el diagnóstico y el código de salida de la segunda, y tendrás un reporte que marca alerta o normal y que puedes usar en producción.

Recibe el umbral en el primer argumento; cuando el conteo agregado por grep -c o awk sea igual o mayor, avisa y devuelve exit 1, y cuando esté por debajo, trátalo como normal y devuelve exit 0.

Quien llama al script puede determinar el éxito o el fallo a partir de ese código de salida.

En la comparación numérica -gt significa mayor que y -ge significa mayor o igual, lo que cambia cómo se trata un valor situado justo en el umbral.

El [ "$err" -gt "$limit" ] de la Práctica 2 no se cumple cuando el conteo es igual al umbral, mientras que el [ "$err" -ge "$limit" ] de la Práctica 3 avisa incluso con un valor igual.

Esa diferencia es la que decide el resultado justo en el valor límite, así que elige el operador que encaje con tu propósito.

Decidir el resultado según un umbral
err=$(grep -c ' 500$')err ≥ limitWARN + exit 1err < limitOK + exit 0igual o por encimapor debajoavisonormal
-ge compara el conteo agregado con el umbral: si es igual o mayor, avisa y devuelve exit 1; si es menor, es normal y devuelve exit 0.

Construye y ejecuta un script de reporte que marque el resultado agregado como alerta o normal según un umbral que pasas como argumento.

① Crea un archivo de ejemplo con printf '12 GET /home 200\n34 GET /login 200\n5 GET /admin 403\n88 GET /api 500\n7 GET /home 200\n21 POST /api 500\n' > access.log.

② Abre report.sh con vi report.sh y presiona i para entrar en modo de inserción. Escribe la lógica del reporte que decide el resultado según el umbral, 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 pasando el umbral como primer argumento, como en ./report.sh 2, y comprueba el resultado en pantalla y el report.txt generado.

⑤ Vuelve a ejecutarlo con otro número, como en ./report.sh 3, y confirma que el resultado también cambia.

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

Verificación de conocimientos

Responde cada pregunta una a una.

Pregunta 1¿Qué sintaxis usa el predeterminado access.log cuando no se pasa un primer argumento?

Pregunta 2¿Qué sintaxis lee un archivo línea por línea y lo procesa?

Pregunta 3¿Cómo le avisas a quien llamó al script de que algo va mal cuando se supera el umbral?