テストケース名とPASSED / FAILED状態を抽出するために、次のコードを書きました。 テストケースログは次のとおりです。:真ん中に行がたくさんあります。
テストケース名(例:A_HL_INT_GPRS_CGDSCONT_0000および対応する「パス」または「失敗」ステータス)を抽出したいと思います。
また、別の質問があります。 grepを使ってシェルスクリプトを実行しましたが、時間がかかりました。
次の問題を解決するには、AWKまたはSEDコマンドを使用する必要があります。
もう1つ必要なのは、次のように失敗したすべてのテストケース名を印刷する必要があることです。
failed testcases list:
A_HL_INT_GPRS_CGDCONT_0002 Failed
A_HL_INT_GPRS_CGDCONT_0003 Failed
A_HL_INT_GPRS_CGDCONT_0004 Failed
Begin of A_HL_INT_GPRS_CGDSCONT_0000
Passed
End of A_HL_INT_GPRS_CGDSCONT_0000
Begin of A_HL_INT_GPRS_CGDCONT_0002
FAILED
End of A_HL_INT_GPRS_CGDCONT_0002
#! /bin/bash
echo "Enter the logfilename : "
read logfilename
echo "Entered name : $logfilename"
echo "outside the while loop"
let success=0
let failure=0
let total=0
DONE=false
until $DONE; do
read line || DONE=true
echo "$line" | grep "Begin of "
if (echo "$line" | grep -i "PASSED") then
((success++))
fi
if (echo "$line" | grep -i "FAILED") then
((failure++))
fi
if (echo "$line" | grep "End of ") then
((total++))
fi
done < "$logfilename"
echo "Total testcases : $total"
echo "Total testcase with Success : $success"
echo "Total testcase with Failure : $failure"
こんにちはプレス:
あなたのコードに一致する次の行を追加しました。
#! /bin/bash
echo -n "Enter the logfilename : "
read logfilename
echo "Entered name : $logfilename"
echo "outside the while loop"
awk 'BEGIN { IGNORECASE=1; }
/^begin of / { print; count=1; passed=failed=0;}
/^end of / { count=0; totalcount++; if(failed)failcount++;else if(passed)passcount++;}
/passed/ && count { passed=1; }
/failed/ && count { failed=1; }
END {
print "Total testcases : " totalcount;
print "Total testcase with Success : " passcount;
print "Total testcase with Failure : " failcount; }' "logfilename"
こんにちはウルテル様、
次のコードを修正できますか? 「Begin of TESTCASENAME」行を削除し、失敗したテストケースを配列に保存してから、失敗したテストケースのリストを印刷しようとしています。また、私はこの状況を処理しようとしました。ログファイルが存在しない場合はどうなりますか?
#! /bin/bash
declare -a arr
# if no command line argument is given
# set logfilename to : logfilename not specified
if [ -z $0 ]
then
logfilename="*** Log filename not specified.***"
elif [ -n $1 ]
then
# otherwise make first arg as logfilename
logfilename=$1
fi
echo "outside the while loop"
let success=0
let failure=0
let total=0
let fail=0
while read line; do
case "$line" in
*Begin\ of\ *) echo $line;;
*PASSED*) ((success++));;
*FAILED*) ((failure++))
arr[$fail] = $line
echo "Shubhra added this line : ${arr[$fail]}"
((fail++));;
*End\ of\ *) ((total++));;
esac
done < "$logfilename"
echo "Total testcases : $total"
echo "Total testcase with Success : $success"
echo "Total testcase with Failure : $failure"
echo "failed testcase list:"
echo ${arr[@]}
答え1
ここで解決策は、シェルに組み込まれたコマンドを使用することです。これは、比較的高価な行に複数の分岐/実行を実行する必要がないためです。
私はそうします:
#! /bin/bash
echo -n "Enter the logfilename : "
read logfilename
echo "Entered name : $logfilename"
echo "outside the while loop"
let success=0
let failure=0
let total=0
failedtests=()
while read line; do
case "$line" in
*Begin\ of\ *) echo $line
failedtests+=( ${line/Begin of /} )
;;
*PASSED*) ((success++));;
*FAILED*) ((failure++));;
*End\ of\ *) ((total++));;
esac
done < "$logfilename"
echo "Total testcases : $total"
echo "Total testcase with Success : $success"
echo "Total testcase with Failure : $failure"
echo "Failed tests:" ${failedtests[@]}
case
グローバルパターンを一致させるために使用できます。サンプルデータ(grepには「pass」ではなく「pass」があります)に基づいて*
各パターンの先行部分を省略できますが、それを使用するとgrepの使用方法と正確に一致します。
DONE
また、最後の空の文字列(ファイルの最後に生成されたもの)を無駄に繰り返しているので、変数を削除しました。
編集:失敗したテストの収集と表示が追加されました。これらはbash配列に収集されますfailedtests
。その結果、文字列の内容が削除されます${line/Begin of /}
。line
最後に、配列の内容全体がで表示されます${failedtests[@]}
。
答え2
AWKがIGNORECASE
大文字と小文字を区別しない比較を強制する変数をサポートしている場合は、次のスクリプトを使用できます。 (たとえば、GNU AWKはLinuxでこれをサポートしています。)
AWKがそれをサポートしていない場合は、次のことがIGNORECASE
できます。
- 一致するすべてのパターンを大文字と小文字を区別しないパターンに変更します(代わりに
/[Pp][Aa][Ss][Ss][Ee][Dd]/
など/passed/
)。または tolower
一致させたい値を持つ関数を使用します(例:tolower($0) ~ /passed/
代わりに/passed/
)。
awk 'BEGIN { IGNORECASE=1; }
/^begin of / { print; count=1; passed=failed=0;}
/^end of / { count=0; totalcount++; if(failed)failcount++;else if(passed)passcount++;}
/passed/ && count { passed=1; }
/failed/ && count { failed=1; }
END {
print "Total testcases : " totalcount;
print "Total testcase with Success : " passcount;
print "Total testcase with Failure : " failcount; }' logfile
この入力を使用してください(ファイルからlogfile
)。
Begin of A_HL_INT_GPRS_CGDSCONT_0000
Passed
foo
End of A_HL_INT_GPRS_CGDSCONT_0000
Begin of A_HL_INT_GPRS_CGDCONT_0002
bar
passed
FAILED
End of A_HL_INT_GPRS_CGDCONT_0002
Begin of foo
failed
End of bar
foo
Passed
FAILED
bar
私はこの結果を得る
Begin of A_HL_INT_GPRS_CGDSCONT_0000
Begin of A_HL_INT_GPRS_CGDCONT_0002
Begin of foo
Total testcases : 3
Total testcase with Success : 1
Total testcase with Failure : 2
注:
スクリプトの編集されたバージョンは行間passed
またはfailed
1回だけカウントされ、優先順位があります。スクリプトは、合計の識別子が一致することを確認しません。begin of ...
end of ...
failed
passed
begin of ...
end of ...