テストケース名と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[@]}
。