вырезать часть вывода grep с помощью sed - PullRequest
4 голосов
/ 11 ноября 2011

Мне нужно получить значения из файла журнала, значения могут отличаться и их нужно получить.

пример строки:

Tests run: 1042, Failures: 0, Errors: 0, Skipped: 0

я пытаюсь с:

cat log.log | grep '^Test run:' | sed -e 's/^Test run: //'

но я получаю: 1042, сбоев: 0, ошибок: 0, пропущено: 0

мне нужно 4 команды, чтобы результат был похож на

первая команда (запуск тестов)

1042

вторая команда (Сбои)

0

третья команда (ошибки)

0

четвертый запятый (Пропущен)

0

Ответы [ 6 ]

7 голосов
/ 11 ноября 2011

Вы можете использовать следующие четыре команды для получения значений для Tests run, Failures, Errors и Skipped соответственно:

cat log.log | sed 's/Tests run: \([0-9]\+\).*/\1/g'
cat log.log | sed 's/.*Failures: \([0-9]\+\).*/\1/g'
cat log.log | sed 's/.*Errors: \([0-9]\+\).*/\1/g'
cat log.log | sed 's/.*Skipped: \([0-9]\+\).*/\1/g'
2 голосов
/ 11 ноября 2011
grep '^Tests run:' <<END | grep -o '[0-9]\+'
Tests run: 1042, Failures: 0, Errors: 0, Skipped: 0
junk
Tests run: 1, Failures: 2, Errors: 3, Skipped: 4
END

выходы

1042
0
0
0
1
2
3
4
1 голос
/ 11 ноября 2011

Примерно так:

sed -n "s/.*Tests run: \([0-9]*\),.*/\1/p"
sed -n "s/.*Failures: \([0-9]*\),.*/\1/p"
sed -n "s/.*Errors: \([0-9]*\),.*/\1/p"
sed -n "s/.*Skipped: \([0-9]*\)$/\1/p"
1 голос
/ 11 ноября 2011

Я не уверен, будет ли это то, что вы хотите или нет, но при условии, что строки, которые вы ищете, будут в следующем формате:

Tests run: <integer>, Failures: <integer>, Errors: <integer>, Skipped: <integer>

Следующее может работать для вас:

sed -e 's/^Tests run: \([0-9]*\), Failures: \([0-9]*\), Errors: \([0-9]*\), Skipped: \([0-9]\).*$/\1,\2,\3,\4/'

При условии следующего ввода в файле с именем test.log

Tests run: 1042, Failures: 0, Errors: 0, Skipped: 0
Tests run: 12, Failures: 0, Errors: 0, Skipped: 0
Tests run: 104, Failures: 1, Errors: 3, Skipped: 4

Running:

cat test.log | sed -e 's/^Tests run: \([0-9]*\), Failures: \([0-9]*\), Errors: \([0-9]*\), Skipped: \([0-9]\).*$/\1,\2,\3,\4/'

даст следующий вывод:

1042,0,0,0
12,0,0,0
104,1,3,4

Конечно, вы можете настроить окончательный вывод, поиграв с / \ 1, \ 2, \ 3, \ 4 / частью выражения sed.

0 голосов
/ 12 ноября 2011

Это может работать для вас:

echo "Tests run: 1042, Failures: 0, Errors: 0, Skipped: 0" | 
sed '/^Tests/{s/[^0-9,]//g;y/,/\n/;}'
1042
0
0
0
0 голосов
/ 11 ноября 2011

Вы имеете в виду что-то подобное?

sed -rn 's/^Tests run:\s*//;s/,[^:]+:\s*/\n/gp' log.log

Результат:

1042
0
0
0
...