2013-05-01 3 views
2

를 추가 텍스트 파일 제목 '결과'하고배쉬 : 문자열의 수를 찾아 내가 가진 그들에게

[ PASSED ] 11 tests. 
[ PASSED ] 590 tests. 
[ PASSED ] 1231 tests. 
[ FAILED ] 4 tests. 
[ FAILED ] 500 tests. 

내가 변수로 전달 된 테스트를 추가하고 저장하고자하는이 포함되어 있습니다. FAILED 테스트를 추가하고 테스트를 추가하고 다른 변수에 저장하십시오.

어떻게하면됩니까?

+1

당신은 awk''보길 원하는 것입니다. –

+0

'case' 문을 사용하십시오. – Barmar

+1

제목에'bash :'라고 써 있습니다. 왜 '배쉬'에서 이것을하고 싶습니까? 작은 awk 스크립트를 작성하고 awk 스크립트의 출력을 bash 변수에 저장하는 것이 더 쉬워 보입니다. – Mikel

답변

3

빠른 방법은 awk입니다.

가정 테스트 출력은 test.out라는 파일에 있습니다

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

echo number of passing tests: $npasses 

<test.outawktest.out에서 읽는 것을 의미한다.

/ PASSED/{ total += $4 }은 총계라는 변수에 네 번째 필드를 추가하지만 정규식 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) 

과 마지막 줄을 대체 할 수

1

while 루프에 sourcecommand; 서브 쉘에서 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

사용 배쉬 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 
관련 문제