Pregunta 1¿Qué guarda n=$(grep -c error log.txt) en la variable n?
Combinar comandos — decidir el flujo según el resultado de grep / awk
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.
Dentro de un script, guarda un conteo en una variable con n=$(grep -c ERROR access.log), suma con total=$(awk '{s+=$1} END{print s}') y bifurca con if [ "$n" -ge 2 ]: un analizador de logs que construyes paso a paso, ilustrado y practicado en una terminal del navegador.
Llamar comandos dentro de un script — pipes y sustitución de comandos
La verdadera fuerza de un script de shell está en que puedes combinar dentro de él comandos comunes como `grep`, `awk`, `sed`, `sort` y `wc`.
Dentro de un script también encadenas comandos con el pipe | y capturas su salida con la sustitución de comandos $(cmd).
Si escribes n=$(grep -c error log.txt), el número de líneas coincidentes que devuelve grep -c se guarda en la variable n.
En una variable también puedes guardar un resultado ya totalizado, como en total=$(awk '{s+=$1} END{print s}' f).
Cuando el resultado de un comando está en una variable, puedes usar ese valor para cambiar el comportamiento del script.
printf 'INFO ok\nERROR disk\nINFO ok\nERROR cpu\n' > sys.log # crear un archivo de ejemplo
vi count.sh # abrir en el editor, escribir lo siguiente y guardar con :wq
# #!/bin/sh
# n=$(grep -c ERROR sys.log)
# echo "ERROR count: $n"
chmod +x count.sh
./count.sh # ERROR count: 2
grep -c se guarda en la variable n, y el if toma la rama de aviso cuando es 2 o más y la rama OK en caso contrario.| Sintaxis | Significado | Ejemplo |
|---|---|---|
n=$(grep -c pat f) | Guardar en la variable n el número de líneas coincidentes | n=$(grep -c error log.txt) |
$(cmd | cmd) | Guardar en una variable el resultado de un pipe | top=$(sort log.txt | head -1) |
if [ "$n" -ge 2 ]; then … | Bifurcar según si el conteo es 2 o más | if [ "$n" -ge 2 ]; then echo warn; fi |
Totalizar y cambiar el comportamiento según el resultado — awk y bifurcación
Más allá de los conteos, también puedes sumar números y decidir a partir del total.
total=$(awk '{s+=$1} END{print s}' f) suma la columna 1 de cada línea y guarda ese total en la variable total.
Cuando quieras el número de apariciones de cada palabra, ordena y cuenta con sort f | uniq -c, y luego captura ese resultado con $(...).
Compara la suma con un umbral, como en if [ "$total" -gt 100 ]; then …, y podrás tomar decisiones como avisar cuando el total pase de un límite.
Junta agregación y bifurcación en un solo script y tendrás una herramienta práctica que lee los datos y evalúa la situación.
printf '40\n30\n50\n' > sales.txt # datos numéricos de una sola columna
vi sum.sh # abrir en el editor, escribir lo siguiente y guardar con :wq
# #!/bin/sh
# total=$(awk '{s+=$1} END{print s}' sales.txt)
# if [ "$total" -gt 100 ]; then
# echo "total $total: meta cumplida"
# else
# echo "total $total: meta no cumplida"
# fi
chmod +x sum.sh
./sum.sh # total 120: meta cumplida
printf 'a\na\nb\n' > tags.txt # archivo de ejemplo con palabras repetidas
sort tags.txt | uniq -c # ordenar primero y luego contar
# salida:
# 2 a
# 1 b
if compara con el umbral 20 el total sumado por awk, y toma la rama de alerta si lo supera y la de aceptable si no.| Sintaxis | Significado | Ejemplo |
|---|---|---|
awk '{s+=$1} END{print s}' f | Sumar la columna 1 | awk '{s+=$1} END{print s}' nums.txt |
sort f | uniq -c | Ordenar antes de contar las apariciones | sort tags.txt | uniq -c |
if [ "$total" -gt N ]; then … | Bifurcar comparando el total con el umbral N | if [ "$total" -gt 100 ]; then … |
Redirigir la salida y los errores — > y 2>
A veces quieres que el resultado de un script quede en un archivo en lugar de en pantalla.
./scan.sh > report.txt escribe la salida normal (la salida estándar) en report.txt.
Si envías los mensajes de error al error estándar con echo "..." 1>&2, ./scan.sh > report.txt 2> error.log te permite guardar los resultados correctos y los errores en archivos distintos.
vi job.sh # abrir en el editor, escribir lo siguiente y guardar con :wq
# #!/bin/sh
# echo "proceso iniciado" # salida estándar
# echo "nota: entrada sin datos" 1>&2 # error estándar
chmod +x job.sh
./job.sh > out.txt 2> err.txt # redirigir salida y errores a archivos distintos
cat out.txt # proceso iniciado
cat err.txt # nota: entrada sin datos
> report.txt y el error estándar a 2> error.log, cada uno por su lado.| Sintaxis | Significado | Ejemplo |
|---|---|---|
cmd > out | Escribir la salida estándar en un archivo | ./scan.sh > report.txt |
echo "…" 1>&2 | Enviar un mensaje al error estándar | echo "failed" 1>&2 |
cmd > out 2> err | Redirigir la salida y los errores a archivos distintos | ./scan.sh > report.txt 2> error.log |
Verificación de conocimientos
Responde cada pregunta una a una.
Pregunta 2¿Qué hace if [ "$n" -ge 2 ]; then …?
Pregunta 3En ./scan.sh > report.txt 2> error.log, ¿qué redirige 2>?