[bash] Zeilen aus Datei zählen

Hallo!
Leider kenne ich mich noch nicht so gut aus mit der bash, aber ich arbeite dran :smile: und da mein Problem etwas schwer zu beschreiben ist, habe ich auch nicht selbst die Lösung gefunden und das führt mich hierher:

Ich will Fehlermeldungen in einer log-Datei zählen, die etwa so aussieht (vereinfacht):

OK
Name1
OK
Name1
Fehler
Name1
OK
Name1
OK
Name2
OK
Name1
Fehler
Name1
Fehler
Name1
Fehler
Name2
Fehler
Name2
.
.
.

Nun will ich die Anzahl der Fehler im Zusammenhang mit Name1 und die mit Name2 ermitteln, suche also die Zeilen mit „Fehler“ und schaue dann, ob in der nächsten Zeile „1“ oder „2“ steht.

Mein Code ist folgender:
öffne Zeile_i -> suche „Fehler“ -> in nächster Zeile „Name1“ oder „Name2“? -> zählen -> nächste Zeile

#!/bin/bash

i=1 #mit Zeile 1 beginnen

suchwort=Fehler
first=0
second=0

firstname=Name1
secondname=Name2

while [sed -n '$ip' foo.log] #solange Zeile existiert
do
if [sed -n '$ip' foo.log | grep $suchwort]; then #wenn Fehler
i=expr $i + 1 #in nächste Zeile gehen

if [grep $firstname sed -n '$ip' foo.log]; then
first=expr $first + 1
fi

if [grep $secondname sed -n '$ip' foo.log]; then
second=expr $second + 1
fi
fi
i=expr $i + 1 #eine Zeile weiter gehen
done

echo 1 : $first
echo 2 : $second

Mir ist klar, dass das verkorkst ist, aber besser schaffe ich es gerade nicht, vielleicht kann das der Profi auch in zwei Zeilen lösen?

Danke für die Hilfe schonmal

destructor

Hallo,

Nun will ich die Anzahl der Fehler im Zusammenhang mit Name1
und die mit Name2 ermitteln, suche also die Zeilen mit
„Fehler“ und schaue dann, ob in der nächsten Zeile „1“ oder
„2“ steht.

grep -A1 Fehler datei | grep Name1 | wc -l
grep -A1 Fehler datei | grep Name2 | wc -l

(ungetestet)

Mir ist klar, dass das verkorkst ist, aber besser schaffe ich
es gerade nicht, vielleicht kann das der Profi auch in zwei
Zeilen lösen?

Bin zwar kein Profi, hoffe aber trotzdem geholfen zu haben.

Moritz

Hi Moritz,
vielen Dank, genau das habe ich gesucht!
Jetzt versuche ich noch zu verstehen, was da genau passiert, wenn man das ausführt :wink: aber ansonsten bin ich mal zufrieden damit!
Grüße
destructor

Hallo,

Jetzt versuche ich noch zu verstehen, was da genau passiert,

‚grep -A1 zeugs‘
sucht nach Zeilen mit dem Wort ‚zeugs‘, und gibt diese und die nächste (das bewirkt das -A1) aus.
Das Ergebnis wird an
‚grep andereszeugs‘
weitergegeben, das nach Zeilen sucht, in denen ‚andereszeugs‘ steht, und diese werden ausgegenben.
Das Ergebnis wird an das Programm wc (word count) übergeben, dessen Option -l sorgt dafür, dass die Anzahl der Zeile gezählt wird.

Alles klar?

Grüße,
Moritz

Wow, vielen Dank!
Sowas in der Art hatte ich schon gedacht (man grep/wc), aber so kompakt hätte ich es jetzt noch nicht formulieren können.
Sonnige Grüße
destructor