Alternativen für 'egrep -o "Erfolg | Fehler | Fehler" <Dateiname> | sortieren | uniq -c '

8

Ich muss manchmal einige Protokolle überprüfen und mache dies mit diesem Befehl:

egrep -o "success|error|fail" <filename> | sort | uniq -c

Beispieleingabe:

test error on line 10
test connect success
test insert success
test started at 00:00
test delete  fail

Beispielausgabe:

1 error
1 fail
2 success

Ich würde gerne wissen, ob jemand einen Weg kennt, dies mit einem kürzeren Befehl zu tun.

Bevor du fragst, warum ich das mit einem anderen Befehl machen möchte ... Kein besonderer Grund, ich bin nur neugierig :)

Wolfy
quelle

Antworten:

4

Hier ist der awkWeg, es zu tun

awk 'BEGIN{RS=" "}/success/{s++}/fail/{f++}/error/{e++}END{print "Success:"s" Failed:"f" Error:"e}' abc

Aber all diese Einzeiler werden etwas länger sein als unsere guten alten grep

devav2
quelle
4

Nein, ich denke du bist so gut wie es nur geht. Natürlich können Sie dies mit einem Perl-Skript tun.

perl -nle  's/.*(error|fail|success).*/$1/ && $a{$_}++ ; END {  print "$_ $a{$_}" for keys %a } ' test.txt

... aber es ist komplexer und weniger intuitiv.

Januar
quelle
Ich habe meiner Frage eine Beispieleingabe hinzugefügt ... Ich hoffe, dass jetzt klarer ist, was der Befehl tut ... sory für die Unannehmlichkeiten
Wolfy
1
OK, ich habe den Perl-Oneliner entsprechend geändert. Ich denke immer noch, dass Ihre Lösung mit egrep besser und intuitiver ist.
Januar
2

Nicht viel kürzer, aber da Sie den regulären Ausdruck nicht wirklich brauchen, gibt es fgrep( grep -F).

fgrep 'success
error
fail' "$filename" | sort | uniq -c

eine andere Möglichkeit, dasselbe in bash zu schreiben:

fgrep $'success\nerror\nfail' "$filename" | sort | uniq -c
Kojiro
quelle
1

Sie können ein einfaches Bash-Skript schreiben und das Skript dann wie folgt aufrufen:

#!/bin/bash
egrep -o "success|error|fail" "$1" | sort | uniq -c

und speichern Sie es als (zum Beispiel) myscript.sh. Dann mach ein chmod +x myscript.shund du kannst es so nennen myscript.sh <filename>.

jeremija
quelle
Aber in diesem Fall ist der Befehl der gleiche ... Sie haben gerade ein Skript erstellt, das den Befehl aufruft ...
Wolfy
Ich dachte, Sie wollten nur das Durchsuchen Ihrer Protokolle beschleunigen. Nur neugierig, warum möchten Sie einen alternativen Befehl, wenn der von Ihnen bereits bereitgestellte einen guten Job für Sie macht?
Jeremija
wie ich schon sagte: Ich bin nur neugierig, wie andere so etwas machen ... oft wurde mir klar, dass die Leute eine ausgefallene / nette Art kennen, Dinge zu tun, und ich liebe es, jetzt zu lernen, wie man Dinge macht ...
Wolfy
2
In diesem Fall sind Sie diese Person :-) Ihre Befehlszeile ist nett, knapp, klar und nutzt die Leistung der Unix-Befehlszeile aus. Was kann man sich sonst noch wünschen?
Januar
0

Ihr Befehl ist zwar kurz und bündig, aber eine ziemlich umständliche Methode, um Vorkommen eines Begriffs zu zählen. Ich würde wahrscheinlich den stumpfen, direkten Ansatz wählen und das -c-Flag von grep (das genau das tut) innerhalb einer Shell-Schleife verwenden:

for i in success test fail; do echo `grep -c $i <filename>` $i; done

Nicht so kurz, nicht so aufregend, möglicherweise schneller für große Protokolldateien (nein sort). Ich würde sagen, es ist eine Wäsche.

Ternär
quelle
-1

Dies könnte eine Scheinantwort sein, aber ich denke, in diesem Fall sortist es ziemlich nutzlos; Vielleicht kannst du es weglassen. Trotzdem verwenden wir hier drei verschiedene Befehle für drei verschiedene Aktionen.

Wir können es kurzschließen, wenn einige von ihnen mit einer Option von erreicht werden können grep, aber ich sehe nicht, welche ... :)

Alessio Tomelleri
quelle
2
Nein, ist es nicht, sonst zählt uniq nur aufeinanderfolgende Instanzen von Suchbegriffen. Wenn Sie beispielsweise Erfolg, Erfolg, Misserfolg, Erfolg haben, wird die Ausgabe von uniq sein 2 success 1 fail 1 success.
Januar
das ist ok ... sry
Alessio Tomelleri