如何用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
相关产品推荐
相关产品推荐

