2013-05-01 39 views
2

我有一个文本文件标题“结果”,它包含击:查找串号并添加他们

[ PASSED ] 11 tests. 
[ PASSED ] 590 tests. 
[ PASSED ] 1231 tests. 
[ FAILED ] 4 tests. 
[ FAILED ] 500 tests. 

我想补充传递的测试,并存储到一个变量。添加FAILED测试,将它们添加并存储到另一个变量中。

我该怎么做?

+1

你会想看看'awk'。 – 2013-05-01 16:42:57

+0

用'case'语句。 – Barmar 2013-05-01 16:43:04

+1

你的标题说'bash:'。你为什么想在'bash'中做这个?编写一个小的'awk'脚本似乎更容易,并且将awk脚本的输出存储在一个bash变量中。 – Mikel 2013-05-01 16:44:43

回答

3

使用awk的一种快速方法。

假设你的测试输出是在一个名为test.out文件:

<test.out意味着awktest.out读取。

/ PASSED/{ total += $4 }将第四个字段追加到名为total的变量中,但仅用于匹配正则表达式PASSED的行。

END { print total }在文件结尾处运行,并打印存储在total中的值。

1

如果日志是在一个文件中,你可以使用

regex='\[ (PASSED|FAILED) \] (\d+) tests.' 
while read -r line; do 
    [[ $line =~ $regex ]] || continue 
    count=${BASH_REMATCH[2]} 
    case ${BASH_REMATCH[1]} in 
     PASSED) let passed += count ;; 
     FAILED) let failed += count ;; 
    esac 
done < input.txt 

要直接从另一个进程阅读,

done < <(sourcecommand) 

替换最后一行没有管道输出的sourcecommand进入while循环;这将导致passedfailed在子外壳中更新。

0

从Mikel的回答扩展, 您可以使用eval直接设置变量。

eval $(awk '/PASSED/ {pass += $4} /FAILED/ {fail += $4} END {print "pass="pass";fail="fail}' FILE_WITH_DATA) 

您现在已经为您设置了变量。

echo $pass 
echo $fail 
1

使用bash 4的关联数组:

declare -A total 
while read _ result _ n _; do 
    ((total[$result]+=$n)) 
done < results 
for key in "${!total[@]}"; do 
    printf "%s\t%d\n" "$key" ${total[$key]} 
done 
PASSED 1832 
FAILED 504