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

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

Мне нужно проанализировать файл журнала и сообщить имя теста, если время его выполнения превышает определенный период (пользователь вводит это время, скажем, скрипт выполнялся более 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.09.00 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.09.00 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.09.00 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
[Фатальная ошибка] 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
набор тестов для string_script.xml
для набора тестов setup_script.xml

решение1

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

Описание:

По сути, это работает в два этапа:

  • awkиспользует регулярные выражения и переменные состояния для определения перехода между файлами и блоками тестового набора. Выводит список с разделителями-трубами, где каждая строка содержит имя тестового набора, тестовый файл, время начала и окончания.
  • while IFS="|" read ...часть берет выходные данные, разделенные символом конвейера, 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

Связанный контент