我需要解析一个日志文件并告诉测试名称其执行时间是否超过特定时间段(用户将输入这次,假设脚本执行时间超过 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 年 9 月 5 日星期一 00:16:32 PDT:报告结果... 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 年 9 月 5 日星期一 00:16:32 PDT:报告结果... 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