SED提取物在2种模式匹配后首次出现

时间:2017-09-20 09:25:11

标签: awk sed csh

我试图使用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,失败原因:

3 个答案:

答案 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