我有一個文本文件標題「結果」,它包含擊:查找串號並添加他們
[ 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