CLI AI

Vorkommen im Log zählen: grep -c ist nicht die Antwort

2026-08-11

grep -c ERROR app.log zählt Zeilen, die das Wort enthalten; grep -o ERROR app.log | wc -l zählt, wie oft das Wort tatsächlich auftaucht. In derselben Datei sind das 3 und 4, und der Unterschied ist eine einzige Zeile mit zwei Fehlern. Welche Zahl Sie brauchen, hängt an der Frage, die Sie eigentlich meinten.

1. Wie viele Zeilen das Wort enthalten

clai
$ clai wie viele zeilen in app.log enthalten ERROR→ grep -c ERROR app.log3

-c zählt Trefferzeilen, nicht Treffer. Eine Zeile mit zwei ERROR zählt weiterhin als eine.

2. Wie oft das Wort vorkommt

clai
$ clai wie oft kommt ERROR in app.log vor→ grep -o ERROR app.log | wc -l4

3 gegen 4 in derselben Datei. -o druckt jeden Treffer in eine eigene Zeile, und erst dann zählt wc -l Vorkommen. Der Zusatz ist genau die Zeile mit den zwei Fehlern.

3. Ohne Rücksicht auf Groß- und Kleinschreibung

clai
$ clai zähle zeilen mit error in beliebiger schreibweise→ grep -ic error app.log4

-i fand eine vierte Zeile — die mit dem kleingeschriebenen Wort. In einem Log, in das mehrere Dienste schreiben, ist die Schreibweise nie garantiert.

4. Die häufigsten Fehlermeldungen

clai
$ clai zeige welche fehler am häufigsten auftreten→ 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

Meist ist das das eigentliche Ziel. -o zieht die Meldung heraus, sed schneidet nachlaufende Leerzeichen ab, uniq -c zählt, und das zweite sort -rn hebt die häufigen nach oben.

5. Verteilung über die Stunden

clai
$ clai zeige in welchen stunden fehler auftraten→ grep ERROR app.log | cut -c12-13 | sort | uniq -c      1 09      1 10      1 11

cut -c12-13 holt die Stunde aus einem Zeitstempel der Form 2026-08-10 09:12:03. Die Positionen hängen an Ihrem Logformat — schauen Sie sich eine Zeile an und zählen Sie die Zeichen, bevor Sie das kopieren.

6. Mehrere Dateien auf einmal

clai
$ clai zähle die fehler in jeder logdatei→ grep -c ERROR *.logapp.log:3app2.log:3

Bei mehr als einer Datei druckt grep Name und Zähler durch einen Doppelpunkt getrennt. Zum Ranking: grep -c ERROR *.log | sort -t: -k2 -rn.

Gotchas

  • grep -c zählt keine Vorkommen. An einer Datei geprüft: -c sagt 3, -o | wc -l sagt 4. Trifft eine Zeile zweimal, sieht -c das nicht. Entscheiden Sie, welche Frage Sie stellen: "wie viele Zeilen" oder "wie oft".
  • grep -o ohne Treffer druckt nichts und endet mit 1. In der Pipe zu wc -l sieht das wie eine ehrliche Null aus, aber der Status ist ungleich null, und ein Skript mit set -e stirbt genau dort.
  • Die Positionen von cut -c hängen am Logformat. Sobald der Logger Millisekunden oder einen Hostnamen voranstellt, zählt die Stundenaufteilung stillschweigend die falschen Zeichen. Bei instabilen Formaten lieber Felder nehmen: awk '{print $2}'.

Related questions

Wie zähle ich ganze Wörter statt Teilzeichenketten? grep -wo error — -w verlangt Wortgrenzen, sonst zählen errors und errorlog mit.

Wie zähle ich in komprimierten Logs? zgrep -c ERROR app.log.1.gz verhält sich wie grep, ohne die Datei auf die Platte zu entpacken.

Wie zähle ich verschiedene Werte? Ein sort -u vor dem Zählen: grep -o 'ERROR [a-z ]*' app.log | sort -u | wc -l liefert die Zahl unterschiedlicher Meldungen statt ihrer Summe.

See also

CliAI macht aus "wie oft" und "wie viele Zeilen" zwei verschiedene Befehle und zeigt, welchen es gewählt hat. In einer Zeile installieren.