用sed切割部分grep输出

时间:2011-11-11 16:21:42

标签: regex linux sed grep

我需要从日志文件中获取值,值可能不同,需要获取它。

字符串示例:

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
第四个commad(Skipped)

0

6 个答案:

答案 0 :(得分:7)

您可以使用以下四个命令分别获取Tests runFailuresErrorsSkipped的值:

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'

答案 1 :(得分:2)

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

答案 2 :(得分:1)

我不确定这是否是您想要的,但假设您要搜索的行将采用以下格式:

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

运行:

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

当然,您可以通过播放sed表达式的/ \ 1,\ 2,\ 3,\ 4 /部分来调整最终输出。

答案 3 :(得分:1)

这样的事情:

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"

答案 4 :(得分:0)

你的意思是这样吗?

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

结果:

1042
0
0
0

答案 5 :(得分:0)

这可能对您有用:

echo "Tests run: 1042, Failures: 0, Errors: 0, Skipped: 0" | 
sed '/^Tests/{s/[^0-9,]//g;y/,/\n/;}'
1042
0
0
0