パラメータを含むログファイルの解析(テストの実行にかかる時間)

パラメータを含むログファイルの解析(テストの実行にかかる時間)

ログファイルを解析して実行時間が一定時間以上かかる場合は、テスト名を知らせる必要があります(ユーザーはスクリプトの実行に30分以上かかると仮定してこの時間を入力します)。

セキュリティテストスイートの起動
9月5日月曜日00:16:30 PDT 2011:スレッドを作成中...
2011年9月5日月曜日00:16:30 PDT:スタート...
2011年9月5日月曜日00:16:31 PDT:結果報告...
9月5日月曜日 00:16:31 PDT 2011: /space/builder/builds/macosx-64/HEAD/qa/scripts/results/add_role_user_security.xmlに結果を書き込む
add_role_user_security.xml:パススルー
9月5日月曜日00:16:31 PDT 2011:スレッドを作成中...
2011年9月5日月曜日00:16:31 PDT:スタート...
2011年9月5日月曜日00:16:32 PDT:結果を報告しています...
9月5日月曜日 00:16:32 PDT 2011: /space/builder/builds/macosx-64/HEAD/qa/scripts/results/privilege.xmlに結果を書き込む
特権.xml: パススルー
9月5日月曜日00:16:32 PDT 2011:スレッドを作成中...
2011年9月5日月曜日00:16:32 PDT:スタート...
2011年9月5日月曜日00:16:32 PDT:結果を報告しています...
9月5日月曜日00:16:32 PDT 2011:/space/builder/builds/macosx-64/HEAD/qa/scripts/results/edit_role_user.xmlに結果を書き込む
edit_role_user.xml:パススルー
9月5日月曜日00:16:32 PDT 2011:スレッドを作成中...
2011年9月5日月曜日00:16:32 PDT:スタート...
2011年9月5日月曜日00:16:33 PDT:結果報告...
9月5日月曜日00:16:33 PDT 2011:/space/builder/builds/macosx-64/HEAD/qa/scripts/results/remove_roles.xmlに結果を書き込む
Remove_roles.xml:パススルー
9月5日月曜日00:16:33 PDT 2011:スレッドを作成中...
2011年9月5日月曜日00:16:33 PDT:スタート...
2011年9月5日月曜日00:16:33 PDT:結果報告...
9月5日月曜日00:16:33 PDT 2011:/space/builder/builds/macosx-64/HEAD/qa/scripts/results/role_user1.xmlに結果を書き込む
role_user1.xml:パススルー
9月5日月曜日00:16:33 PDT 2011:スレッドを作成中...
2011年9月5日月曜日00:16:33 PDT:スタート...
2011年9月5日月曜日00:16:34 PDT:結果報告...
9月5日月曜日00:16:34 PDT 2011:/space/builder/builds/macosx-64/HEAD/qa/scripts/results/role_user2.xmlに結果を書き込む
bug10611.xml:合格
セキュリティテストスイート
テストスイートの開始
9月5日月曜日00:18:52 PDT 2011:スレッドを作成中...
2011年9月5日月曜日00:18:52 PDT:スタート...
2011年9月5日月曜日00:18:52 PDT:結果報告...
9月5日月曜日00:18:52 PDT 2011:/space/builder/builds/macosx-64/HEAD/qa/scripts/results/setup_script.xmlに結果を書き込む
setup_script.xml:合格
9月5日月曜日00:18:52 PDT 2011:スレッドを作成中...
2011年9月5日月曜日00:18:52 PDT:スタート...
2011年9月5日月曜日00:18:58 PDT:結果報告...
9月5日月曜日00:18:58 PDT 2011:/space/builder/builds/macosx-64/HEAD/qa/scripts/results/bug_scripts.xmlに結果を書き込む
bug_scripts.xml:合格
9月5日月曜日00:18:58 PDT 2011:スレッドを作成中...
2011年9月5日月曜日00:18:58 PDT:スタート...
2011年9月5日月曜日00:18:58 PDT:結果報告...
9月5日月曜日 00:18:58 PDT 2011: /space/builder/builds/macosx-64/HEAD/qa/scripts/results/loadtime_namespace.xmlに結果を書き込む
[重大なエラー] loadtime_namespace.xml:11:25: '[xX][mM][lL]' と一致する処理コマンドのターゲットは許可されていません。
loadtime_namespace.xmlを解析できません。比較するには、diffユーティリティを実行してください...
rm -f ./scripts/diffs/loadtime_namespace.xml
loadtime_namespace.xml:パススルー
9月5日月曜日00:19:01 PDT 2011:スレッドを作成中...
2011年9月5日月曜日00:19:01 PDT:スタート...
2011年9月5日月曜日00:19:01 PDT:結果報告...
9月5日月曜日00:19:01 PDT 2011:/space/builder/builds/macosx-64/HEAD/qa/scripts/results/string_script.xmlに結果を書き込む
string_script.xml:通過
テストスイートについて

ユーザーは実行に要した時間を渡してスクリプトを実行します。

sh script_name.sh 60

実行に60分以上かかるテストのリストを含める必要があります。

出力は次のようになります。

セキュリティテストスイートadd_role_user_security.xml
セキュリティテスト suiteprivilege.xml
セキュリティテストスイートRemove_roles.xml
セキュリティテストスイートstring_script.xml
foテストスイートstring_script.xml
テストスイート setup_script.xml

答え1

この回答の下のコードは、あなたが要求したアクションを実行し、あなたが提供した例に基づいて動作します。

説明する:

基本的には2段階で動作します。

  • awk正規表現と状態変数を使用して、ファイルとテストスイートブロック間の遷移を決定します。各行に、テストスイート名、テストファイル、開始時刻と終了時刻を含むパイプで区切られたリストを出力します。
  • while IFS="|" read ...パイプで区切られた出力をawk一部の変数として部分的に読み込みます。これを使用してdateタイムスタンプをエポック後の秒に変換し、差を計算して入力値と比較します。

コードは検証に関して多くのことをしないので、直接追加する必要があります。

パスワード:

#!/usr/bin/sh

# Get the arguments
INPUT_FILENAME="$1"
FILTER_MINUTES="$2"

# Convert minutes to seconds
FILTER_SECONDS="$(( FILTER_MINUTES * 60 ))"

awk '
BEGIN {
    printf("%s,%s,%s,%s\n","TEST_NAME","FILENAME","START_TIME","END_TIME");
    TEST_NAME="";
    START_TIME="";
    END_TIME="";
  }
match($0, "^start (.+)$", arr) {
    TEST_NAME=arr[1];
    START_TIME="";
    END_TIME="";
    FILENAME="";
    /* printf("TEST_NAME START: %s\n", TEST_NAME); */
  }
match($0, /^(.+.xml) : (.+)$/, arr)  {
    FILENAME=sprintf("%s",arr[1]);
    printf("%s|%s|%s|%s\n",TEST_NAME,FILENAME,START_TIME,END_TIME);
    START_TIME="";
    END_TIME="";
    FILENAME="";
  }
match($0, /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2}) ([^\ ]+) ([0-9]{4}):.*$/, arr) {
    if(START_TIME ~ /^$/)
       START_TIME=sprintf("%s-%s-%s %s:%s:%s %s",arr[3],arr[2],arr[8],arr[4],arr[5],arr[6],arr[7]);
    else
       END_TIME=sprintf("%s-%s-%s %s:%s:%s %s",arr[3],arr[2],arr[8],arr[4],arr[5],arr[6],arr[7]);
  }
$0 ~ "^" TEST_NAME "$" {
    /* printf("TEST_NAME END: %s\n", TEST_NAME); */
    TEST_NAME="";
    START_TIME="";
    END_TIME="";
    FILENAME="";
  }
' "$INPUT_FILENAME" | while IFS="|" read TEST_NAME FILENAME START_TIME END_TIME
do
  START_TIME_SEC=$(date -d "$START_TIME" +%s)
  END_TIME_SEC=$(date -d "$END_TIME" +%s)
  ELAPSED_SEC=$((END_TIME_SEC-START_TIME_SEC))

  # No time supplied or elapsed time exceded.
  if [ -z "$FILTER_MINUTES" -o "$ELAPSED_SEC" -gt "$FILTER_SECONDS" ]
  then
    ## Remove $ELAPSED_SEC from here to not print elapsed seconds.
    echo $TEST_NAME $FILENAME $ELAPSED_SEC
  fi
done

関連情報