проанализировать файл журнала, который принимает аргумент (время выполнения тестов)

Мне нужно проанализировать файл журнала и сообщить имя теста, если его время выполнения больше определенного периода (пользователь будет вводить это время, скажем, скрипт, выполненный более 30 минут)

 начать набор тестов безопасности
 Пн Сен 05 00:16:30 PDT 2011: создание потоков ...
 Пн Сен 05 00:16:30 PDT 2011: начало ...
 Пн Сен 05 00:16:31 PDT 2011: Отчетные результаты ...
 Пн Сен 05 00:16:31 PDT 2011: Написание результатов в /space/builder/builds/macosx-64/HEAD/qa/scripts/results/add_role_user_security.xml
 add_role_user_security.xml: пройден
 Пн Сен 05 00:16:31 PDT 2011: создание потоков ...
 Пн Сен 05 00:16:31 PDT 2011: начало ...
 Пн Сен 05 00:16:32 PDT 2011: Отчетные результаты ...
 Пн Сен 05 00:16:32 PDT 2011: Написание результатов в /space/builder/builds/macosx-64/HEAD/qa/scripts/results/privilege.xml
 privilege.xml: Прошел
 Пн Сен 05 00:16:32 PDT 2011: создание потоков ...
 Пн Сен 05 00:16:32 PDT 2011: начало ...
 Пн Сен 05 00:16:32 PDT 2011: Отчетные результаты ...
 Пн Сен 05 00:16:32 PDT 2011: Написание результатов в /space/builder/builds/macosx-64/HEAD/qa/scripts/results/edit_role_user.xml
 edit_role_user.xml: пройден
 Пн Сен 05 00:16:32 PDT 2011: создание потоков ...
 Пн Сен 05 00:16:32 PDT 2011: начало ...
 Пн Сен 05 00:16:33 PDT 2011: Отчетные результаты ...
 Пн Сен 05 00:16:33 PDT 2011: Написание результатов в /space/builder/builds/macosx-64/HEAD/qa/scripts/results/remove_roles.xml
 remove_roles.xml: пройден
 Пн Сен 05 00:16:33 PDT 2011: создание потоков ...
 Пн Сен 05 00:16:33 PDT 2011: начало ...
 Пн Сен 05 00:16:33 PDT 2011: Отчетные результаты ...
 Пн Сен 05 00:16:33 PDT 2011: Написание результатов в /space/builder/builds/macosx-64/HEAD/qa/scripts/results/role_user1.xml
 role_user1.xml: пройден
 Пн Сен 05 00:16:33 PDT 2011: создание потоков ...
 Пн Сен 05 00:16:33 PDT 2011: начало ...
 Пн Сен 05 00:16:34 PDT 2011: Отчетные результаты ...
 Пн Сен 05 00:16:34 PDT 2011: Написание результатов в /space/builder/builds/macosx-64/HEAD/qa/scripts/results/role_user2.xml
 bug10611.xml: Прошел
 набор тестов безопасности
 начать набор тестов
 Пн Сен 05 00:18:52 PDT 2011: создание потоков ...
 Пн Сен 05 00:18:52 PDT 2011: начало ...
 Пн Сен 05 00:18:52 PDT 2011: Отчетные результаты ...
 Пн Сен 05 00:18:52 PDT 2011: Написание результатов в /space/builder/builds/macosx-64/HEAD/qa/scripts/results/setup_script.xml
 setup_script.xml: пройден
 Пн Сен 05 00:18:52 PDT 2011: создание потоков ...
 Пн Сен 05 00:18:52 PDT 2011: начало ...
 Пн Сен 05 00:18:58 PDT 2011: Отчетные результаты ...
 Пн Сен 05 00:18:58 PDT 2011: Запись результатов в /space/builder/builds/macosx-64/HEAD/qa/scripts/results/bug_scripts.xml
 bug_scripts.xml: пройден
 Пн Сен 05 00:18:58 PDT 2011: создание потоков ...
 Пн Сен 05 00:18:58 PDT 2011: начало ...
 Пн Сен 05 00:18:58 PDT 2011: Отчетные результаты ...
 Пн Сен 05 00:18:58 PDT 2011: Запись результатов в /space/builder/builds/macosx-64/HEAD/qa/scripts/results/loadtime_namespace.xml
 [Fatal Error] loadtime_namespace.xml: 11: 25: Целевое задание команды обработки «[xX] [mM] [lL]» недопустимо.
 Невозможно проанализировать loadtime_namespace.xml: Запуск утилиты diff для сравнения ...
 rm -f ./scripts/diffs/loadtime_namespace.xml
 loadtime_namespace.xml: пройден
 Пн Сен 05 00:19:01 PDT 2011: создание потоков ...
 Пн Сен 05 00:19:01 PDT 2011: начало ...
 Пн Сен 05 00:19:01 PDT 2011: Отчетные результаты ...
 Пн Сен 05 00:19:01 PDT 2011: Написание результатов в /space/builder/builds/macosx-64/HEAD/qa/scripts/results/string_script.xml
 string_script.xml: пройден
 набор для тестирования

Пользователь выполнит скрипт, передав время выполнения сценария

sh script_name.sh 60 

И он должен иметь список тестов, которые занимают более 60 минут для выполнения

Выход должен быть следующим:

 набор тестов безопасности add_role_user_security.xml
 набор тестов безопасности privilege.xml
 набор тестов безопасности remove_roles.xml
 набор тестов безопасности string_script.xml
 fo test suite string_script.xml
 fo test suite setup_script.xml

Код внизу этого ответа делает то, что вы просили, и работает на основе предоставленного вами образца.

Описание:

Он в основном работает в два этапа:

  • awk использует регулярные выражения и переменные состояния для определения перехода между файлами и блоками набора тестов. Он выводит список с разделителями каналов, где каждая строка имеет имя тестового набора, тестовый файл, время начала и окончания.
  • while IFS="|" read ... while IFS="|" read ... part принимает выходной awk ограниченный по трубам от awk считывает его в некоторые переменные, где я использую date для преобразования временных меток в секунды с эпохи, а затем вычисляет разницу и сравнивает ее с входным значением.

Этот код не очень помогает в проверке, поэтому вам придется добавить это самостоятельно.

Код:

 #!/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