我有一个文本文件标题'results',它包含
[ PASSED ] 11 tests.
[ PASSED ] 590 tests.
[ PASSED ] 1231 tests.
[ FAILED ] 4 tests.
[ FAILED ] 500 tests.
我想将PASSED测试添加到变量中。添加FAILED测试,添加它们并存储到另一个变量中。
我该怎么做?
答案 0 :(得分:3)
使用awk
的一种快捷方式。
假设您的测试输出位于名为test.out
的文件中:
#!/bin/bash
npasses=$(<test.out awk '
/ PASSED / { total += $4 }
END { print total }')
echo number of passing tests: $npasses
<test.out
表示awk
从test.out
读取。
/ PASSED / { total += $4 }
将第四个字段附加到名为total的变量,但仅适用于与正则表达式PASSED
匹配的行。
END { print total }
在文件末尾运行,并打印存储在total
中的值。
答案 1 :(得分: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循环中;这将导致在子shell中更新passed
和failed
。
答案 2 :(得分: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
答案 3 :(得分:0)
从Mikel的回答中扩展,
您可以使用eval
直接设置变量。
eval $(awk '/PASSED/ {pass += $4} /FAILED/ {fail += $4} END {print "pass="pass";fail="fail}' FILE_WITH_DATA)
您现在已经为您设置了变量。
echo $pass
echo $fail