CLI AI

Contar apariciones en un log: grep -c no es la respuesta

2026-08-11

grep -c ERROR app.log cuenta las líneas que contienen la palabra; grep -o ERROR app.log | wc -l cuenta cuántas veces aparece de verdad. En el mismo archivo eso da 3 y 4, y la diferencia es una única línea con dos errores. Cuál número quieres depende de la pregunta que querías hacer.

1. Cuántas líneas contienen la palabra

clai
$ clai cuántas líneas de app.log contienen ERROR→ grep -c ERROR app.log3

-c cuenta líneas coincidentes, no coincidencias. Una línea con dos ERROR sigue contando como una.

2. Cuántas veces aparece la palabra

clai
$ clai cuántas veces aparece ERROR en app.log→ grep -o ERROR app.log | wc -l4

3 contra 4 en el mismísimo archivo. -o imprime cada coincidencia en su propia línea, y solo entonces wc -l cuenta apariciones. La de más es la línea con dos errores.

3. Sin distinguir mayúsculas

clai
$ clai cuenta las líneas con error sin distinguir mayúsculas→ grep -ic error app.log4

-i recogió una cuarta línea: aquella donde la palabra va en minúsculas. En un log escrito por varios servicios, las mayúsculas nunca están garantizadas.

4. Los errores más frecuentes

clai
$ clai muestra qué errores ocurren con más frecuencia→ grep -o 'ERROR [a-z ]*' app.log | sed 's/ *$//' | sort | uniq -c | sort -rn      2 ERROR timeout connecting to db      1 ERROR retry failed      1 ERROR permission denied

Este suele ser el objetivo real. -o extrae el mensaje, sed recorta los espacios finales, uniq -c cuenta y el segundo sort -rn sube los frecuentes.

5. Reparto por horas

clai
$ clai muestra en qué horas hubo errores→ grep ERROR app.log | cut -c12-13 | sort | uniq -c      1 09      1 10      1 11

cut -c12-13 saca la hora de una marca 2026-08-10 09:12:03. Las posiciones dependen del formato de tu log: mira una línea y cuenta los caracteres antes de copiar esto.

6. Varios archivos a la vez

clai
$ clai cuenta los errores de cada archivo de log→ grep -c ERROR *.logapp.log:3app2.log:3

Con más de un archivo, grep imprime nombre y cuenta separados por dos puntos. Para ordenarlos: grep -c ERROR *.log | sort -t: -k2 -rn.

Gotchas

  • grep -c no cuenta apariciones. Verificado en un archivo: -c dice 3, -o | wc -l dice 4. Cuando una línea coincide dos veces, -c no lo ve. Decide qué preguntas: "cuántas líneas" o "cuántas veces".
  • grep -o sin coincidencias no imprime nada y sale con 1. Canalizado a wc -l parece un cero honesto, pero el estado de salida no es cero y un script con set -e muere justo ahí.
  • Las posiciones de cut -c dependen del formato del log. En cuanto el logger añade milisegundos o un nombre de host al principio, el reparto por horas cuenta caracteres equivocados sin avisar. Para formatos inestables usa campos: awk '{print $2}'.

Related questions

¿Cómo cuento palabras completas en vez de subcadenas? grep -wo error — -w exige límites de palabra; si no, errors y errorlog entran en la cuenta.

¿Cómo cuento dentro de logs comprimidos? zgrep -c ERROR app.log.1.gz se comporta como grep sin descomprimir el archivo en disco.

¿Cómo cuento valores distintos? Añade sort -u antes de contar: grep -o 'ERROR [a-z ]*' app.log | sort -u | wc -l da el número de mensajes diferentes, no su total.

See also

CliAI convierte "cuántas veces" y "cuántas líneas" en dos comandos distintos y muestra cuál eligió. Instálalo en una línea.