analisar um arquivo de log que recebe um argumento (tempo de execução gasto pelos testes)

analisar um arquivo de log que recebe um argumento (tempo de execução gasto pelos testes)

Preciso analisar um arquivo de log e informar o nome do teste se o tempo de execução for superior a um período específico (o usuário inserirá esse tempo, digamos que o script foi executado por mais de 30 minutos)

iniciar conjunto de testes de segurança
Seg, 05 de setembro 00:16:30 PDT 2011: criando tópicos...
Segunda-feira, 05 de setembro, 00:16:30 PDT 2011: começando...
Segunda-feira, 05 de setembro, 00:16:31 PDT 2011: Relatório de resultados...
Seg, 05 de setembro 00:16:31 PDT 2011: Gravando resultados em /space/builder/builds/macosx-64/HEAD/qa/scripts/results/add_role_user_security.xml
add_role_user_security.xml: Aprovado
Seg, 05 de setembro 00:16:31 PDT 2011: criando tópicos...
Seg, 05 de setembro 00:16:31 PDT 2011: começando...
Segunda-feira, 05 de setembro, 00:16:32 PDT 2011: Relatório de resultados...
Seg, 05 de setembro 00:16:32 PDT 2011: Gravando resultados em /space/builder/builds/macosx-64/HEAD/qa/scripts/results/privilege.xml
privilégio.xml: Aprovado
Seg, 05 de setembro 00:16:32 PDT 2011: criando tópicos...
Seg, 05 de setembro 00:16:32 PDT 2011: começando...
Segunda-feira, 05 de setembro, 00:16:32 PDT 2011: Relatório de resultados...
Seg, 05 de setembro 00:16:32 PDT 2011: Gravando resultados em /space/builder/builds/macosx-64/HEAD/qa/scripts/results/edit_role_user.xml
edit_role_user.xml: Aprovado
Seg, 05 de setembro 00:16:32 PDT 2011: criando tópicos...
Seg, 05 de setembro 00:16:32 PDT 2011: começando...
Segunda-feira, 05 de setembro, 00:16:33 PDT 2011: Relatório de resultados...
Seg, 05 de setembro 00:16:33 PDT 2011: Gravando resultados em /space/builder/builds/macosx-64/HEAD/qa/scripts/results/remove_roles.xml
remove_roles.xml: Aprovado
Seg, 05 de setembro 00:16:33 PDT 2011: criando tópicos...
Seg, 05 de setembro 00:16:33 PDT 2011: começando...
Segunda-feira, 05 de setembro, 00:16:33 PDT 2011: Relatório de resultados...
Seg, 05 de setembro 00:16:33 PDT 2011: Gravando resultados em /space/builder/builds/macosx-64/HEAD/qa/scripts/results/role_user1.xml
role_user1.xml: Aprovado
Seg, 05 de setembro 00:16:33 PDT 2011: criando tópicos...
Seg, 05 de setembro 00:16:33 PDT 2011: começando...
Segunda-feira, 05 de setembro, 00:16:34 PDT 2011: Relatório de resultados...
Seg, 05 de setembro 00:16:34 PDT 2011: Gravando resultados em /space/builder/builds/macosx-64/HEAD/qa/scripts/results/role_user2.xml
bug10611.xml: Aprovado
conjunto de testes de segurança
início do conjunto de testes
Seg, 05 de setembro 00:18:52 PDT 2011: criando tópicos...
Seg, 05 de setembro 00:18:52 PDT 2011: começando...
Segunda-feira, 05 de setembro, 00:18:52 PDT 2011: Relatório de resultados...
Seg, 05 de setembro 00:18:52 PDT 2011: Gravando resultados em /space/builder/builds/macosx-64/HEAD/qa/scripts/results/setup_script.xml
setup_script.xml: Aprovado
Seg, 05 de setembro 00:18:52 PDT 2011: criando tópicos...
Seg, 05 de setembro 00:18:52 PDT 2011: começando...
Segunda-feira, 05 de setembro, 00:18:58 PDT 2011: Relatório de resultados...
Seg, 05 de setembro 00:18:58 PDT 2011: Gravando resultados em /space/builder/builds/macosx-64/HEAD/qa/scripts/results/bug_scripts.xml
bug_scripts.xml: Aprovado
Seg, 05 de setembro 00:18:58 PDT 2011: criando tópicos...
Seg, 05 de setembro 00:18:58 PDT 2011: começando...
Segunda-feira, 05 de setembro, 00:18:58 PDT 2011: Relatório de resultados...
Seg, 05 de setembro 00:18:58 PDT 2011: Gravando resultados em /space/builder/builds/macosx-64/HEAD/qa/scripts/results/loadtime_namespace.xml
[Erro fatal] loadtime_namespace.xml:11:25: O destino da instrução de processamento correspondente a "[xX][mM][lL]" não é permitido.
Não foi possível analisar loadtime_namespace.xml: Executando o utilitário diff para comparar...
rm -f ./scripts/diffs/loadtime_namespace.xml
loadtime_namespace.xml: aprovado
Seg, 05 de setembro 00:19:01 PDT 2011: criando tópicos...
Seg, 05 de setembro 00:19:01 PDT 2011: começando...
Segunda-feira, 05 de setembro, 00:19:01 PDT 2011: Relatório de resultados...
Seg, 05 de setembro 00:19:01 PDT 2011: Gravando resultados em /space/builder/builds/macosx-64/HEAD/qa/scripts/results/string_script.xml
string_script.xml: aprovado
suíte de testes

O usuário executará o script passando o tempo de execução gasto pelo script

sh script_name.sh 60

E deve ter a lista de testes que levam mais de 60 minutos para serem executados

A saída deve ser como:

conjunto de testes de segurança add_role_user_security.xml
privilégio do conjunto de testes de segurança.xml
conjunto de testes de segurança remove_roles.xml
conjunto de testes de segurança string_script.xml
conjunto de testes para string_script.xml
para conjunto de testes setup_script.xml

Responder1

O código na parte inferior desta resposta faz o que você pediu e funciona com base no exemplo fornecido.

Descrição:

Funciona basicamente em duas etapas:

  • awkusa expressões regulares e variáveis ​​de estado para determinar a transição entre arquivos e blocos de suíte de testes. Ele gera uma lista delimitada por barras verticais onde cada linha tem o nome do conjunto de testes, arquivo de teste, horário de início e término.
  • while IFS="|" read ...part pega a saída delimitada por canal e awklê-a em algumas variáveis ​​​​que eu uso datepara converter carimbos de data / hora em segundos desde a época e, em seguida, calcula a diferença e compara-a com o valor de entrada.

O código não faz muito em termos de validação, então você mesmo terá que adicioná-lo.

Código:

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

informação relacionada