解析帶有參數的日誌檔案(測試所花費的執行時間)

解析帶有參數的日誌檔案(測試所花費的執行時間)

我需要解析一個日誌檔案並告訴測試名稱其執行時間是否超過特定時間段(使用者將輸入這次,假設腳本執行時間超過 30 分鐘)

啟動安全測試套件
Mon Sep 05 00:16:30 PDT 2011:建立執行緒...
2011 年 9 月 5 日星期一 00:16:30 PDT:開始...
2011 年太平洋夏令時 (PDT) 星期一 9 月 5 日 00:16:31:報告結果...
Mon Sep 05 00:16:31 PDT 2011:將結果寫入 /space/builder/builds/macosx-64/HEAD/qa/scripts/results/add_role_user_security.xml
add_role_user_security.xml :透過
Mon Sep 05 00:16:31 PDT 2011:建立執行緒...
2011 年太平洋夏令時間 9 月 5 日星期一 00:16:31:開始...
2011 年太平洋夏令時 (PDT) 星期一 9 月 5 日 00:16:32:報告結果...
Mon Sep 05 00:16:32 PDT 2011:將結果寫入 /space/builder/builds/macosx-64/HEAD/qa/scripts/results/privilege.xml
特權.xml:透過
Mon Sep 05 00:16:32 PDT 2011:建立執行緒...
2011 年 9 月 5 日星期一 00:16:32 PDT:開始...
2011 年太平洋夏令時 (PDT) 星期一 9 月 5 日 00:16:32:報告結果...
Mon Sep 05 00:16:32 PDT 2011:將結果寫入 /space/builder/builds/macosx-64/HEAD/qa/scripts/results/edit_role_user.xml
edit_role_user.xml :透過
Mon Sep 05 00:16:32 PDT 2011:建立執行緒...
2011 年 9 月 5 日星期一 00:16:32 PDT:開始...
2011 年太平洋夏令時 (PDT) 星期一 9 月 5 日 00:16:33:報告結果...
Mon Sep 05 00:16:33 PDT 2011:將結果寫入 /space/builder/builds/macosx-64/HEAD/qa/scripts/results/remove_roles.xml
remove_roles.xml:透過
Mon Sep 05 00:16:33 PDT 2011:建立執行緒...
2011 年 9 月 5 日星期一 00:16:33 PDT:開始...
2011 年太平洋夏令時 (PDT) 星期一 9 月 5 日 00:16:33:報告結果...
Mon Sep 05 00:16:33 PDT 2011:將結果寫入 /space/builder/builds/macosx-64/HEAD/qa/scripts/results/role_user1.xml
role_user1.xml :透過
Mon Sep 05 00:16:33 PDT 2011:建立執行緒...
2011 年 9 月 5 日星期一 00:16:33 PDT:開始...
2011 年太平洋夏令時 (PDT) 週一 9 月 5 日 00:16:34:報告結果...
Mon Sep 05 00:16:34 PDT 2011:將結果寫入 /space/builder/builds/macosx-64/HEAD/qa/scripts/results/role_user2.xml
bug10611.xml:透過
安全測試套件
啟動測試套件
Mon Sep 05 00:18:52 PDT 2011:建立執行緒...
2011 年 9 月 5 日星期一 00:18:52 PDT:開始...
2011 年太平洋夏令時 (PDT) 星期一 9 月 5 日 00:18:52:報告結果...
Mon Sep 05 00:18:52 PDT 2011:將結果寫入 /space/builder/builds/macosx-64/HEAD/qa/scripts/results/setup_script.xml
setup_script.xml:透過
Mon Sep 05 00:18:52 PDT 2011:建立執行緒...
2011 年 9 月 5 日星期一 00:18:52 PDT:開始...
2011 年太平洋夏令時 (PDT) 星期一 9 月 5 日 00:18:58:報告結果...
Mon Sep 05 00:18:58 PDT 2011:將結果寫入 /space/builder/builds/macosx-64/HEAD/qa/scripts/results/bug_scripts.xml
bug_scripts.xml:透過
Mon Sep 05 00:18:58 PDT 2011:建立執行緒...
2011 年 9 月 5 日星期一 00:18:58 PDT:開始...
2011 年太平洋夏令時 (PDT) 星期一 9 月 5 日 00:18:58:報告結果...
Mon Sep 05 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 :透過
Mon Sep 05 00:19:01 PDT 2011:建立執行緒...
2011 年太平洋夏令時間 9 月 5 日星期一 00:19:01:開始...
2011 年太平洋夏令時 (PDT) 星期一 9 月 5 日 00:19:01:報告結果...
Mon Sep 05 00:19:01 PDT 2011:將結果寫入 /space/builder/builds/macosx-64/HEAD/qa/scripts/results/string_script.xml
string_script.xml:透過
fo 測試套件

用戶將透過傳遞腳本所花費的執行時間來執行腳本

sh script_name.sh 60

它應該包含執行時間超過 60 分鐘的測試列表

輸出應該是這樣的:

安全測試套件 add_role_user_security.xml
安全測試套件privilege.xml
安全測試套件remove_roles.xml
安全測試套件 string_script.xml
fo 測試套件 string_script.xml
測試套件 setup_script.xml

答案1

此回應底部的程式碼執行您所要求的操作,並根據您提供的範例工作。

描述:

它基本上分兩個階段工作:

  • 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

相關內容