
Как бы я проанализировал следующий выводlein test
$ lein test
lein test nepleaks-engine.core-test
Ran 1 tests containing 1 assertions.
0 failures, 0 errors.
Мне нужно получить число перед failures
использованием bash-скрипта.
Я знаю только одно grep
:
$ lein test | grep 'failures' | cut -d' ' -f1
0
Предложите мне лучшие способы сделать это.
решение1
Ваше решение возвращает часть каждой строки, содержащую «сбои» до первого пробела.
Если вы хотите быть более конкретными, вы можете сделать следующее:
sed -n '$s/^\([[:digit:]]\{1,\}\) failures.*/\1/p'
То есть, рассматривать только последнюю строку ( $
), и только если она следует определенному шаблону: любая непустая последовательность десятичных цифр, за которой следует failures
(и возвращать эту последовательность цифр).
решение2
Нет ничего неправильного в том, как вы это делаете, при условии, что это failures
произойдет только в одной строке вывода. Другой вариант — закрепить тот факт, что количество отказов всегда находится в 4-й строке вывода. Это очень просто с awk
:
lein test | awk 'NR==4 { print $1 }'
Или привязаться к строке, где failures,
находится второе поле:
lein test | awk '$2=="failures," { print $1 }'
Или сделать якорь на последней строке:
lein test | awk 'END { print $1 }'
Или используйте sed
якорь на последней строке:
lein test | sed -n '$ s/^\([0-9]*\).*/\1/p'
решение3
С помощью awk (вывести $1, что означает первый столбец):
lein test | grep 'failures' | awk '{print $1}'
решение4
Через awk,
lein test | awk '/ failures,/{print $1}'
И с GNU sed
,
lein test | sed -n '/ failures,/s/^\([^ ]\+\).*/\1/p'
Или переносимо:
lein test | sed -n '/ failures,/s/^\([^ ]\{1,\}\).*/\1/p'