
Ich versuche gerade, ein Skript in Bash zu schreiben, das eine Reihe von Unit-/Integrationstests ausführen kann. Dieser Teil funktioniert, aber was ich jetzt brauche, ist die Möglichkeit, am Ende eine Zusammenfassung auszugeben. Ich habe versucht, grep
ot zu verwenden, um jede Zeile zu erfassen, die eine Zahl gefolgt von der Zeichenfolge enthält failing
, sie in einer Variablen zu speichern und am Ende auszudrucken.
Ein Beispiel für eine fehlgeschlagene Ausgabe ist
224 passing (3m)
47 failing
Ich möchte am Ende etwas in der Art gedruckt haben wie
service01 4 failing
service03 1 failing
Was ich bisher habe, ist:
OUTPUT=""
for service in ${array[*]}
do
echo $service
if [ $DO_API == 'true' ]
then
echo 'running API tests'
OUTPUT+="$service API $(docker exec -it $service npm run api_test | tee /dev/tty | grep -e '[0-9]+ failing' )"
fi
if [ $DO_CI == 'true' ]
then
echo 'running CI tests'
OUTPUT+="$service CI $(docker exec -it $service npm run ci | tee /dev/tty | grep -e '[0-9]+ failing' )"
fi
echo $'\n'
done
Das obige Skript zeigt bei fehlgeschlagenen Tests keine Ausgabe, was mich annehmen lässt, dass der Fehler an meiner Grep-Syntax liegt.
Was mache ich falsch?
Antwort1
Der folgende grep
Befehl gibt die erforderliche Ausgabe zurück:
grep -E '[0-9]+ failing'
Das Muster [0-9]+
entspricht einer oder mehreren Ziffern. Die -E
Option muss verwendet werden, damit grep
das Muster als erweiterter regulärer Ausdruck interpretiert werden kann. Der +
Quantifizierer ist nicht als Teil der grundlegenden regulären Ausdrücke definiert.
Beispiellauf (mit einer Datei):
$ cat testfile
224 passing (3m)
47 failing
$ grep -E '[0-9]+ failing' testfile
47 failing
Abgesehen davon kann dieses Muster auch mithilfe grundlegender regulärer Ausdrücke (BRE) auf folgende Weise implementiert werden:
$ grep '[0-9]\{1,\} failing' testfile
47 failing
In diesem Fall {n,m}
wird der Quantifizierer verwendet, um eine oder mehrere Ziffern abzugleichen. Die Backslashes sind erforderlich, um den geschweiften Klammern ihre besondere Bedeutung zu geben.