
Wie würde ich die folgende Ausgabe analysieren vonlein test
$ lein test
lein test nepleaks-engine.core-test
Ran 1 tests containing 1 assertions.
0 failures, 0 errors.
Ich möchte die Nummer abrufen, bevor failures
ich das Bash-Skript verwende.
Ich weiß nur, dass es besser ist grep
,
$ lein test | grep 'failures' | cut -d' ' -f1
0
Schlagen Sie mir bessere Möglichkeiten vor, dies zu tun.
Antwort1
Ihre Lösung gibt den Teil jeder Zeile zurück, der „Fehler“ bis zum ersten Leerzeichen enthält.
Wenn Sie genauer sein möchten, können Sie Folgendes tun:
sed -n '$s/^\([[:digit:]]\{1,\}\) failures.*/\1/p'
Das heißt, berücksichtigen Sie nur die letzte Zeile ( $
) und nur, wenn sie einem bestimmten Muster folgt: eine beliebige nicht leere Folge von Dezimalziffern, gefolgt von failures
(und geben Sie diese Ziffernfolge zurück).
Antwort2
An Ihrer Vorgehensweise ist nichts auszusetzen, vorausgesetzt, dass dies failures
nur in einer Zeile der Ausgabe geschieht. Eine andere Möglichkeit könnte darin bestehen, sich darauf zu verlassen, dass die Anzahl der Fehler immer in der vierten Zeile der Ausgabe steht. Dies ist sehr einfach mit awk
:
lein test | awk 'NR==4 { print $1 }'
Oder zum Ankern an einer Zeile, in der failures,
sich das zweite Feld befindet:
lein test | awk '$2=="failures," { print $1 }'
Oder um in der letzten Zeile zu verankern:
lein test | awk 'END { print $1 }'
Oder verwenden Sie sed
zum Ankern in der letzten Zeile:
lein test | sed -n '$ s/^\([0-9]*\).*/\1/p'
Antwort3
Mit awk (print $1, bedeutet erste Spalte):
lein test | grep 'failures' | awk '{print $1}'
Antwort4
Durch awk,
lein test | awk '/ failures,/{print $1}'
Und mit sed
GNU
lein test | sed -n '/ failures,/s/^\([^ ]\+\).*/\1/p'
Oder portabel:
lein test | sed -n '/ failures,/s/^\([^ ]\{1,\}\).*/\1/p'