Bash:在字符串中查找数字并添加它们

Bash:在字符串中查找数字并添加它们,bash,shell,scripting,Bash,Shell,Scripting,我有一个文本文件标题“results”,其中包含 [ PASSED ] 11 tests. [ PASSED ] 590 tests. [ PASSED ] 1231 tests. [ FAILED ] 4 tests. [ FAILED ] 500 tests. 我想添加通过的测试并将其存储到变量中。添加失败的测试,添加它们并存储到另一个变量中 我如何才能做到这一点?一种使用awk的快速方法 假设您的测试输出位于名为test.out的文件中: #!/bin/bash np

我有一个文本文件标题“results”,其中包含

[  PASSED  ] 11 tests.
[  PASSED  ] 590 tests.
[  PASSED  ] 1231 tests.
[  FAILED  ] 4 tests.
[  FAILED  ] 500 tests.
我想添加通过的测试并将其存储到变量中。添加失败的测试,添加它们并存储到另一个变量中


我如何才能做到这一点?

一种使用awk的快速方法

假设您的测试输出位于名为
test.out
的文件中:

#!/bin/bash
npasses=$(<test.out awk '
/ PASSED / { total += $4 }
END { print total }')

echo number of passing tests: $npasses
#/bin/bash

npasses=$(如果日志位于文件中,则可以使用

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
regex='\[(通过|失败)\](\d+)测试。”
当读取-r行时;执行
[$line=~$regex]| |继续
计数=${BASH_重新匹配[2]}
案例${BASH_重新匹配[1]}in
通过)让通过+=计数;;
失败)让失败+=count;;
以撒
完成
要直接从另一个进程读取,请将最后一行替换为

done < <( sourcecommand )

done<从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

您需要使用
case
语句查看
awk
。您的标题是
bash:
。为什么要在
bash
中执行此操作?编写一个小的
awk
脚本,并在bash变量中运行并存储awk脚本的输出似乎更容易。
PASSED  1832
FAILED  504