我试图使用c-shell(我担心其他选项不可用)和SED来解决这个问题。给出这个示例文件,其中包含所有失败的测试报告:
============
test_085
============
- Signature code: F2B0C
- Failure reason: timeout
- Error: test has timed out
============
test_102
============
- Signature code: B4B4A
- Failure reason: syntax
- Error: Syntax error on file example.c at line 245
============
test_435
============
- Signature code: 000FC0
- Failure reason: timeout
- Error: test has timed out
我有一个脚本循环遍历我正在运行的所有测试,我会根据此报告检查它们,看看是否失败并稍后进行一些统计:
if (`grep -c $test_name $test_report` > 0) then
printf ",TEST FAILED" >>! $report
else
printf ",TEST PASSED" >>! $report
endif
我想要做的是在$ test_report中找到$ test_name的原因。例如,对于test_085,我只想提取' timeout',对于test_102仅提取'语法'对于test_435' timeout',对于test_045,它不会是这种情况,因为在此报告中找不到(意味着它已通过)。本质上我想在这两个模式匹配后首先提取:test_085,失败原因:
答案 0 :(得分:1)
为指定的测试名称提取“失败原因” - 短 awk 方法:
awk -v t_name="test_102" '$1==t_name{ f=1 }f && /Failure reason/{ print $4; exit }' reportfile
$1==t_name{ f=1 }
- 遇到与模式匹配的行(即测试名称 t_name
) - 将标志f
设置为活动状态
f && /Failure reason/
- 在考虑测试名称部分的行中进行迭代(同时f
处于“活动状态”) - 使用{{1}捕获该行并打印第4个字段中的原因
Failure reason
- 立即退出脚本以避免冗余处理
输出:
exit
答案 1 :(得分:0)
您可以尝试处理RS
的{{1}}和FS
个变量,以便更轻松地进行解析:
awk
输出:
$ awk -v RS='' -F='==*' '{gsub(/\n/," ")
sub(/.*Failure reason:/,"",$3)
sub(/- Error:.*/,"",$3)
printf "%s : %s\n",$2,$3}' file
如果您不关心换行符,可以删除 test_085 : timeout
test_102 : syntax
test_435 : timeout
功能。
答案 2 :(得分:0)
每当您的输入具有带有名称的属性作为值映射时,最好的方法是首先创建一个数组来捕获下面的那些映射(n2v[]
),然后按名称访问这些值。例如:
$ cat tst.awk
BEGIN { RS=""; FS="\n" }
$2 == id {
for (i=4; i<=NF; i++) {
name = value = $i
gsub(/^- |:.*$/,"",name)
gsub(/^[^:]+: /,"",value)
n2v[name] = value
}
print n2v[attr]
}
$ awk -v id='test_085' -v attr='Failure reason' -f tst.awk file
timeout
$ awk -v id='test_085' -v attr='Error' -f tst.awk file
test has timed out
$ awk -v id='test_102' -v attr='Signature code' -f tst.awk file
B4B4A
$ awk -v id='test_102' -v attr='Error' -f tst.awk file
Syntax error on file example.c at line 245
$ awk -v id='test_102' -v attr='Failure reason' -f tst.awk file
syntax