我有一个文本文件标题“结果”,它包含击:查找串号并添加他们
[ PASSED ] 11 tests.
[ PASSED ] 590 tests.
[ PASSED ] 1231 tests.
[ FAILED ] 4 tests.
[ FAILED ] 500 tests.
我想补充传递的测试,并存储到一个变量。添加FAILED测试,将它们添加并存储到另一个变量中。
我该怎么做?
我有一个文本文件标题“结果”,它包含击:查找串号并添加他们
[ PASSED ] 11 tests.
[ PASSED ] 590 tests.
[ PASSED ] 1231 tests.
[ FAILED ] 4 tests.
[ FAILED ] 500 tests.
我想补充传递的测试,并存储到一个变量。添加FAILED测试,将它们添加并存储到另一个变量中。
我该怎么做?
使用awk
的一种快速方法。
假设你的测试输出是在一个名为test.out
文件:
<test.out
意味着awk
从test.out
读取。
/ PASSED/{ total += $4 }
将第四个字段追加到名为total的变量中,但仅用于匹配正则表达式PASSED
的行。
END { print total }
在文件结尾处运行,并打印存储在total
中的值。
如果日志是在一个文件中,你可以使用
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循环;这将导致passed
和failed
在子外壳中更新。
从Mikel的回答扩展, 您可以使用eval
直接设置变量。
eval $(awk '/PASSED/ {pass += $4} /FAILED/ {fail += $4} END {print "pass="pass";fail="fail}' FILE_WITH_DATA)
您现在已经为您设置了变量。
echo $pass
echo $fail
使用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
你会想看看'awk'。 – 2013-05-01 16:42:57
用'case'语句。 – Barmar 2013-05-01 16:43:04
你的标题说'bash:'。你为什么想在'bash'中做这个?编写一个小的'awk'脚本似乎更容易,并且将awk脚本的输出存储在一个bash变量中。 – Mikel 2013-05-01 16:44:43