シェルスクリプトで時間がかかるので、GREPの代わりにSEDまたはAWKを使用する方法

シェルスクリプトで時間がかかるので、GREPの代わりにSEDまたはAWKを使用する方法

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

おすすめ記事