Analysieren Sie eine Protokolldatei, die ein Argument annimmt (Ausführungszeit der Tests)

Analysieren Sie eine Protokolldatei, die ein Argument annimmt (Ausführungszeit der Tests)

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:

  • awkverwendet 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, awkliest sie in einige Variablen ein, wo ich dateZeitstempel 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

verwandte Informationen