Extrai o número de falhas de um relatório de teste

0

Como eu analisaria a seguinte saída de lein test

$ lein test
lein test nepleaks-engine.core-test

Ran 1 tests containing 1 assertions.
0 failures, 0 errors.

Onde eu quero é obter o número antes de failures usando o script bash.

Eu só sei melhor é grep ,

$ lein test | grep 'failures' | cut -d' ' -f1
0 

Sugira as melhores maneiras de fazer isso.

    
por prayagupd 12.06.2014 / 14:10

7 respostas

3

Não há nada de errado com o modo como você está fazendo isso, desde que failures ocorra apenas em uma linha da saída. Outra opção pode ser ancorar no fato de que o número de falhas está sempre na quarta linha de saída. Isso é muito fácil com awk :

lein test | awk 'NR==4 { print $1 }'

Ou para ancorar em uma linha em que failures, é o segundo campo:

lein test | awk '$2=="failures," { print $1 }'

Ou para ancorar na última linha:

lein test | awk 'END { print $1 }'

Ou usando sed para ancorar na última linha:

lein test | sed -n '$ s/^\([0-9]*\).*//p'
    
por 12.06.2014 / 14:19
4

Sua solução retorna a parte de cada linha que contém "falhas" até o primeiro caractere de espaço.

Se você quer ser mais específico, você pode fazer:

sed -n '$s/^\([[:digit:]]\{1,\}\) failures.*//p'

Ou seja, considere apenas a última linha ( $ ) e somente se seguir um padrão específico: qualquer sequência não vazia de dígitos decimais seguida por  failures (e retornar essa sequência de dígitos).

    
por 12.06.2014 / 15:41
1

Com o awk (imprima $ 1, significa primeira coluna):

lein test | grep 'failures' | awk '{print $1}'
    
por 12.06.2014 / 14:19
1

Tente isto:

lein test | tail -n 1 | tr -s " " "\n" | head -n 1

Como funciona?

  • tail -n 1 leva a última linha
  • tr -s " " "\n" substitui todos os espaços pelo novo caractere de linha. É um bom truque para tokenizar a entrada por algum personagem.
  • head -n 1 leva a primeira linha
por 12.06.2014 / 14:19
1

Através do awk,

lein test | awk '/ failures,/{print $1}'

E com o% GNUsed,

lein test | sed -n '/ failures,/s/^\([^ ]\+\).*//p'

Ou portavelmente:

lein test | sed -n '/ failures,/s/^\([^ ]\{1,\}\).*//p'
    
por 12.06.2014 / 14:22
1

Considerando a saída, talvez (se você tiver a implementação GNU de grep ):

lein test | grep -m 1 -o '^[[:digit:]]*'

Mais seguro, com a mesma implementação:

lein test | grep -E 'failures.*errors' | grep -o '^[[:digit:]]*'

Nas páginas de trabalho :

-o, --only-matching

Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line.

-m NUM, --max-count=NUM

Stop reading a file after NUM matching lines.[...]

    
por 12.06.2014 / 14:29
0

Você pode tentar usar este código:

lein test | tail | tr " " "\n" | head -1

que deve dar o que você quer.

    
por 13.06.2014 / 02:06