2013-05-01 43 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