You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用AWK条件获取匹配行后的第2行或第4行?

需求实现方案

问题说明

我用awk 'c&&!--c;/regexp/{c=N}' file这类命令提取测试失败详情,规则是:找到以●开头的测试套件行后,通常取其后第2行作为失败详情;但如果这第2行匹配特定字符串(比如Expected test not to call console.error),则需要取该套件行后的第4行。

两种场景示例:

场景1(常规情况)

● Test Suite > Use case >

Type Error: Illegal constructor

此时取Type Error: Illegal constructor这一行

场景2(特殊情况)

● Test Suite > Use case >

Expected test not to call console.error

If the error is expected ...

Warning: Failed prop type ...

此时需取Warning: Failed prop type ...这一行

awk实现命令

可以通过在awk里增加状态判断来实现,命令如下:

/^●/ {
    # 记录当前行号,准备跟踪后续行
    mark = NR
    next
}
# 检查是否是标记行后的第2行
NR == mark + 2 {
    if ($0 ~ /Expected test not to call console.error/) {
        # 匹配指定模式,需要取第4行,标记要获取的行号
        target = mark + 4
    } else {
        # 不匹配,直接输出当前行
        print $0
    }
    next
}
# 检查是否是需要获取的目标行
NR == target {
    print $0
    # 重置标记,避免后续误匹配
    target = 0
    mark = 0
}

命令解释

  • /^●/:匹配以●开头的测试套件行,记录当前行号到mark变量
  • NR == mark + 2:判断是否是标记行后的第2行,检查内容是否匹配指定模式:
    • 匹配则把目标行号设为mark + 4(标记行后的第4行)
    • 不匹配则直接输出当前行
  • NR == target:当行号等于目标行号时,输出该行,然后重置标记变量避免干扰后续处理

使用方法

将上述命令保存为脚本(比如extract_test_error.awk),或者直接在命令行运行:

awk -f extract_test_error.awk your_test_output_file

也可以把命令直接写在一行:

awk '/^●/{mark=NR;next} NR==mark+2{if($0~/Expected test not to call console.error/){target=mark+4}else{print $0};next} NR==target{print $0;target=0;mark=0}' your_test_output_file

内容的提问来源于stack exchange,提问作者AncientSwordRage

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 02:40:18