Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用sed剪切grep输出的一部分_Regex_Linux_Sed_Grep - Fatal编程技术网

Regex 使用sed剪切grep输出的一部分

Regex 使用sed剪切grep输出的一部分,regex,linux,sed,grep,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个命令,结果是这样的 第一个命令(测试运行) 第二个命令(失败) 第三个命令(错误) 第四个命令(跳过) 你是说像这样的事吗 sed -rn

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

字符串示例:

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个命令,结果是这样的

第一个命令(测试运行)

第二个命令(失败)

第三个命令(错误)

第四个命令(跳过)


你是说像这样的事吗

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

1042
0
0
0

您可以使用以下四个命令分别获取
测试运行
失败
错误
跳过
的值:

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'

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

Tests run: <integer>, Failures: <integer>, Errors: <integer>, Skipped: <integer>
在名为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/部分来调整最终输出。

类似以下内容:

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"

这可能适合您:

sed -e 's/^Tests run: \([0-9]*\), Failures: \([0-9]*\), Errors: \([0-9]*\), Skipped: \([0-9]\).*$/\1,\2,\3,\4/'
echo "Tests run: 1042, Failures: 0, Errors: 0, Skipped: 0" | 
sed '/^Tests/{s/[^0-9,]//g;y/,/\n/;}'
1042
0
0
0
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 -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"
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
echo "Tests run: 1042, Failures: 0, Errors: 0, Skipped: 0" | 
sed '/^Tests/{s/[^0-9,]//g;y/,/\n/;}'
1042
0
0
0