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 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 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 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 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 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 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 -cno cuenta apariciones. Verificado en un archivo:-cdice 3,-o | wc -ldice 4. Cuando una línea coincide dos veces,-cno lo ve. Decide qué preguntas: "cuántas líneas" o "cuántas veces".grep -osin coincidencias no imprime nada y sale con 1. Canalizado awc -lparece un cero honesto, pero el estado de salida no es cero y un script conset -emuere justo ahí.- Las posiciones de
cut -cdependen 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
- Seguir varios archivos de log a la vez
- journalctl: los logs de un servicio
- Eliminar líneas duplicadas, con o sin ordenar
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.