Ich muss eine Protokolldatei analysieren und den Testnamen angeben, wenn die Ausführungszeit einen bestimmten Zeitraum überschreitet (der Benutzer gibt diese Zeit ein, sagen wir, das Skript wurde länger als 30 Minuten ausgeführt).
Sicherheitstestsuite starten Montag, 5. September 2011, 00:16:30 PDT: Threads erstellen … Montag, 5. September 2011, 00:16:30 PDT: Beginn … Montag, 5. September 2011, 00:16:31 PDT: Ergebnisse werden gemeldet … Montag, 5. September 2011, 00:16:31 PDT: Ergebnisse werden in /space/builder/builds/macosx-64/HEAD/qa/scripts/results/add_role_user_security.xml geschrieben. add_role_user_security.xml: Bestanden Montag, 5. September 2011, 00:16:31 PDT: Threads erstellen … Montag, 5. September 2011, 00:16:31 PDT: Beginn … Montag, 5. September 2011, 00:16:32 PDT: Ergebnisse werden gemeldet … Montag, 5. September 2011, 00:16:32 PDT: Ergebnisse werden in /space/builder/builds/macosx-64/HEAD/qa/scripts/results/privilege.xml geschrieben. privilege.xml: Bestanden Montag, 5. September 2011, 00:16:32 PDT: Threads erstellen … Montag, 5. September 2011, 00:16:32 PDT: Beginn … Montag, 5. September 2011, 00:16:32 PDT: Ergebnisse werden gemeldet … Montag, 5. September 2011, 00:16:32 PDT: Ergebnisse werden in /space/builder/builds/macosx-64/HEAD/qa/scripts/results/edit_role_user.xml geschrieben. edit_role_user.xml: Bestanden Montag, 5. September 2011, 00:16:32 PDT: Threads erstellen … Montag, 5. September 2011, 00:16:32 PDT: Beginn … Montag, 5. September 2011, 00:16:33 PDT: Ergebnisse werden gemeldet … Montag, 5. September 2011, 00:16:33 PDT: Ergebnisse werden in /space/builder/builds/macosx-64/HEAD/qa/scripts/results/remove_roles.xml geschrieben. remove_roles.xml: Bestanden Montag, 5. September 2011, 00:16:33 PDT: Threads erstellen … Montag, 5. September 2011, 00:16:33 PDT: Beginn … Montag, 5. September 2011, 00:16:33 PDT: Ergebnisse werden gemeldet … Montag, 5. September 2011, 00:16:33 PDT: Ergebnisse werden in /space/builder/builds/macosx-64/HEAD/qa/scripts/results/role_user1.xml geschrieben. role_user1.xml: Bestanden Montag, 5. September 2011, 00:16:33 PDT: Threads erstellen … Montag, 5. September 2011, 00:16:33 PDT: Beginn … Montag, 5. September 2011, 00:16:34 PDT: Ergebnisse werden gemeldet … Montag, 5. September 2011, 00:16:34 PDT: Ergebnisse werden in /space/builder/builds/macosx-64/HEAD/qa/scripts/results/role_user2.xml geschrieben. bug10611.xml: Bestanden Sicherheitstestsuite Start der Testsuite Montag, 5. September 2011, 00:18:52 PDT: Threads erstellen … Montag, 5. September 2011, 00:18:52 PDT: Beginn … Montag, 5. September 2011, 00:18:52 PDT: Ergebnisse werden gemeldet … Montag, 5. September 2011, 00:18:52 PDT: Ergebnisse werden in /space/builder/builds/macosx-64/HEAD/qa/scripts/results/setup_script.xml geschrieben. setup_script.xml: Bestanden Montag, 5. September 2011, 00:18:52 PDT: Threads erstellen … Montag, 5. September 2011, 00:18:52 PDT: Beginn … Montag, 5. September 2011, 00:18:58 PDT: Ergebnisse werden gemeldet … Montag, 5. September 2011, 00:18:58 PDT: Ergebnisse werden in /space/builder/builds/macosx-64/HEAD/qa/scripts/results/bug_scripts.xml geschrieben. bug_scripts.xml: Bestanden Montag, 5. September 2011, 00:18:58 PDT: Threads erstellen … Montag, 5. September 2011, 00:18:58 PDT: Beginn … Montag, 5. September 2011, 00:18:58 PDT: Ergebnisse werden gemeldet … Montag, 5. September 2011, 00:18:58 PDT: Ergebnisse werden in /space/builder/builds/macosx-64/HEAD/qa/scripts/results/loadtime_namespace.xml geschrieben. [Schwerwiegender Fehler] loadtime_namespace.xml:11:25: Die Verarbeitungsanweisung mit der Zielübereinstimmung „[xX][mM][lL]“ ist nicht zulässig. loadtime_namespace.xml kann nicht analysiert werden: Zum Vergleichen wird das Diff-Dienstprogramm ausgeführt … rm -f ./scripts/diffs/loadtime_namespace.xml loadtime_namespace.xml: Bestanden Montag, 5. September 2011, 00:19:01 PDT: Threads erstellen … Montag, 5. September 2011, 00:19:01 PDT: Beginn … Montag, 5. September 2011, 00:19:01 PDT: Ergebnisse werden gemeldet … Montag, 5. September 2011, 00:19:01 PDT: Ergebnisse werden in /space/builder/builds/macosx-64/HEAD/qa/scripts/results/string_script.xml geschrieben. string_script.xml: Bestanden für Testsuite
Der Benutzer führt das Skript aus, indem er die vom Skript benötigte Ausführungszeit überschreitet
sh script_name.sh 60
Und es sollte die Liste der Tests enthalten, deren Ausführung länger als 60 Minuten dauert
Die Ausgabe sollte wie folgt aussehen:
Sicherheitstestsuite add_role_user_security.xml Sicherheitstestsuite-Berechtigung.xml Sicherheitstestsuite remove_roles.xml Sicherheitstestsuite string_script.xml für Testsuite string_script.xml für die Testsuite setup_script.xml
Antwort1
Der Code am Ende dieser Antwort macht, was Sie verlangt haben, und funktioniert auf der Grundlage des von Ihnen bereitgestellten Beispiels.
Beschreibung:
Es funktioniert grundsätzlich in zwei Phasen:
awk
verwendet reguläre Ausdrücke und Statusvariablen, um den Übergang zwischen Dateien und Testsuite-Blöcken zu bestimmen. Es wird eine durch Pipes getrennte Liste ausgegeben, in der jede Zeile den Namen der Testsuite, die Testdatei sowie die Start- und Endzeit enthält.while IFS="|" read ...
Ein Teil übernimmt die durch Pipes getrennte Ausgabe,awk
liest sie in einige Variablen ein, wo ichdate
Zeitstempel in Sekunden seit der Epoche umwandle, und berechne dann die Differenz und vergleiche sie mit dem Eingabewert.
Der Code leistet nicht viel zur Validierung, Sie müssen dies also selbst hinzufügen.
Code:
#!/usr/bin/sh
# Get the arguments
INPUT_FILENAME="$1"
FILTER_MINUTES="$2"
# Convert minutes to seconds
FILTER_SECONDS="$(( FILTER_MINUTES * 60 ))"
awk '
BEGIN {
printf("%s,%s,%s,%s\n","TEST_NAME","FILENAME","START_TIME","END_TIME");
TEST_NAME="";
START_TIME="";
END_TIME="";
}
match($0, "^start (.+)$", arr) {
TEST_NAME=arr[1];
START_TIME="";
END_TIME="";
FILENAME="";
/* printf("TEST_NAME START: %s\n", TEST_NAME); */
}
match($0, /^(.+.xml) : (.+)$/, arr) {
FILENAME=sprintf("%s",arr[1]);
printf("%s|%s|%s|%s\n",TEST_NAME,FILENAME,START_TIME,END_TIME);
START_TIME="";
END_TIME="";
FILENAME="";
}
match($0, /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2}) ([^\ ]+) ([0-9]{4}):.*$/, arr) {
if(START_TIME ~ /^$/)
START_TIME=sprintf("%s-%s-%s %s:%s:%s %s",arr[3],arr[2],arr[8],arr[4],arr[5],arr[6],arr[7]);
else
END_TIME=sprintf("%s-%s-%s %s:%s:%s %s",arr[3],arr[2],arr[8],arr[4],arr[5],arr[6],arr[7]);
}
$0 ~ "^" TEST_NAME "$" {
/* printf("TEST_NAME END: %s\n", TEST_NAME); */
TEST_NAME="";
START_TIME="";
END_TIME="";
FILENAME="";
}
' "$INPUT_FILENAME" | while IFS="|" read TEST_NAME FILENAME START_TIME END_TIME
do
START_TIME_SEC=$(date -d "$START_TIME" +%s)
END_TIME_SEC=$(date -d "$END_TIME" +%s)
ELAPSED_SEC=$((END_TIME_SEC-START_TIME_SEC))
# No time supplied or elapsed time exceded.
if [ -z "$FILTER_MINUTES" -o "$ELAPSED_SEC" -gt "$FILTER_SECONDS" ]
then
## Remove $ELAPSED_SEC from here to not print elapsed seconds.
echo $TEST_NAME $FILENAME $ELAPSED_SEC
fi
done