일부 소프트웨어에서 testSuite를 실행한 결과를 요약하려면 생성된 .xml 파일을 구문 분석해야 합니다. 예를 들어 내 줄 중 하나에서 :
<Summary failed="10" notExecuted="0" timeout="0" pass="18065" />
이는 실패한 테스트, 실행되지 않은 테스트, 통과한 테스트 수를 나타냅니다. 테스트 스위트에 몇 개의 테스트가 있는지 계산해야 하므로 위의 경우에는 10+0+18065 = 18075를 추가해야 합니다.
Bash에서 이 작업을 어떻게 수행할 수 있나요?
답변1
당신은 그것을 사용할 수 있습니다xmlstarlet
올바른 XML 구문 분석을 위해.
귀하의 질문에 대해:
total=0; \
for i in failed notExecuted pass; do \
sum=`xmlstarlet sel -t -v "//Summary/@$i" test.xml`; \
total=$(($sum + $total)); \
done; \
echo "Total=$total"
test.xml
xml 데이터가 포함된 파일은 어디에 있습니까?
답변2
사용perl
perl -lne 'my @a=$_=~/(\d+)/g;$sum+=$_ for @a; print $sum' file
사용awk
tr ' ' '\n' < file |
awk '/[0-9]+/ {gsub(/[^0-9]/, "", $0); sum+=$0} END {print sum}'
예
% perl -lne 'my @a=$_=~/(\d+)/g;$sum+=$_ for @a; print $sum' foo
18075
% tr ' ' '\n' < foo |
awk '/[0-9]+/ {gsub(/[^0-9]/, "", $0); sum+=$0} END {print sum}'
18075
% cat foo
<Summary failed="10" notExecuted="0" timeout="0" pass="18065" />
답변3
숫자나 공백이 아닌 문자를 모두 삭제하세요.
echo '<Summary failed="10" notExecuted="0" timeout="0" pass="18065" />'|\
sed -e 's/[^0-9 ]//g'
주어진
10 0 0 18065
.
합산은 dc를 사용하여 수행할 수 있습니다(요청에 따라 제한 시간 필드 필터링).
echo '<Summary failed="10" notExecuted="0" timeout="0" pass="18065" />'|\
sed -e 's/timeout="[0-9]*" //' \
-e 's/[^0-9 ]//g' \
-e 's/^ *//' \
-e 's/ *$//' \
-e 's/ /+/g' \
-e 's/^/0 /' \
-e 's/$/pq/'|dc
.
설명하다
sed 스크립트는 다음과 같습니다
s/timeout="[0-9]*" // #remove the timeout
s/[^0-9 ]//g #drop anything but numbers and spaces
s/^ *// #drop spaces at the beginning of the line
s/ *$// #drop spaces at the end of the line
s/ /+/g #replace remaining spaces with +
s/^/0 / #add a 0 to initialize the sum for dc
s/$/pq/ #add print and quit command for dc
스크립트는 다음과 같이 간단히 사용할 수 있습니다.
INPUT|sed -f script.sed
. 여러 줄 입력을 위해 sed 및 dc를 사용하여 이 스크립트를 적용하는 것은 여러분의 몫입니다. 내가 작성해야 할 것은 한 줄뿐입니다!
답변4
다음과 같은 XML 파서를 사용하십시오.XML 스타질문에 제공된 파일:
$ xml sel -t -m '//Summary' -v '@failed+@notExecuted+@timeout+@pass' -nl file.xml
18075
Summary
여러 위치에 있는 노드가 발견 되면 각 노드에 대해 한 줄이 출력됩니다.
xmlstarlet
일부 시스템 에서는 XMLStarlet이 xml
.