
Como eu analisaria a seguinte saída delein 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
usar o script bash.
Eu só sei que melhor é grep
,
$ lein test | grep 'failures' | cut -d' ' -f1
0
Sugira-me as melhores maneiras de fazer isso.
Responder1
Sua solução retorna a parte de cada linha que contém "falhas" até o primeiro caractere de espaço.
Se quiser ser mais específico, você poderia fazer:
sed -n '$s/^\([[:digit:]]\{1,\}\) failures.*/\1/p'
Ou seja, considere apenas a última linha ( $
), e somente se ela seguir um padrão específico: qualquer sequência não vazia de dígitos decimais seguida por failures
(e retorne essa sequência de dígitos).
Responder2
Não há nada de errado com a maneira como você está fazendo isso, desde que isso failures
ocorra apenas em uma linha da saída. Outra opção poderia ser ancorar-se no fato de que o número de falhas está sempre na 4ª linha da saída. Isso é muito fácil com awk
:
lein test | awk 'NR==4 { print $1 }'
Ou para ancorar em uma linha onde failures,
está 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]*\).*/\1/p'
Responder3
Com awk (print $1, significa primeira coluna):
lein test | grep 'failures' | awk '{print $1}'
Responder4
Através do awk,
lein test | awk '/ failures,/{print $1}'
E com o GNU sed
,
lein test | sed -n '/ failures,/s/^\([^ ]\+\).*/\1/p'
Ou portável:
lein test | sed -n '/ failures,/s/^\([^ ]\{1,\}\).*/\1/p'