如何优化提取无右括号后缀的FAILED短语的命令(无需sed管道)
提取指定失败测试短语的命令优化
需求说明
提取包含FAILED且其后无右括号)的短语,同时剔除所有位于Linux x86_64)之前的内容。
输入示例
Chrome Headless 117.0.5938.132 (Linux x86_64): Executed 5 of 270[32m SUCCESS[39m (0 secs / 0.018 secs) WARN: 'Spec 'zip combines one value of each' has no expectations.' [1A[2KChrome Headless 117.0.5938.132 (Linux x86_64): Executed 6 of 270[32m SUCCESS[39m (0 secs / 0.021 secs) [1A[2K[31mChrome Headless 117.0.5938.132 (Linux x86_64) interval should emit every second FAILED[39m Expected $[0].frame = 1007 to equal 1000. Expected $[1].frame = 2007 to equal 2000. Expected $[2].frame = 3007 to equal 3000. Expected $[3].frame = 4007 to equal 4000. Expected $[4].frame = 5007 to equal 5000. Expected $[5].frame = 5007 to equal 5000. at <Jasmine> at TestScheduler.assertDeepEqual (src/misc/test_scheduler.ts:4:20) at filter (node_modules/rxjs/dist/esm/internal/testing/TestScheduler.js:139:22) at Array.filter (<anonymous>) at TestScheduler.flush (node_modules/rxjs/dist/esm/internal/testing/TestScheduler.js:137:43) Chrome Headless 117.0.5938.132 (Linux x86_64): Executed 7 of 270[31m (1 FAILED)[39m (0 secs / 0.027 secs)
预期输出
interval should emit every second FAILED
当前实现命令
已实现的可行命令,但依赖管道调用sed:
grep ' FAILED[^)]' in | sed -e 's#.*Linux x86_64)##' -e 's# ##'
优化后的单命令方案
方案1:使用带PCRE模式的grep
直接用grep完成所有处理,无需管道:
grep -Po '(?<=Linux x86_64\))\s*\K.*FAILED[^)]*' in
参数解释:
-P:启用Perl兼容正则表达式(PCRE)-o:仅输出匹配到的内容(?<=Linux x86_64\)):正向预查,锁定Linux x86_64)之后的内容\s*:匹配行中可能存在的空格\K:忽略之前匹配的所有内容,只保留后续需要的部分.*FAILED[^)]*:匹配到FAILED且其后无右括号的目标内容
方案2:使用awk(兼容更多系统)
如果系统不支持grep -P,可以用awk实现:
awk '/ FAILED[^)]/{sub(/.*Linux x86_64\)/,""); sub(/^ /,""); print}' in
逻辑解释:
/ FAILED[^)]/:先筛选出包含FAILED且其后无)的行sub(/.*Linux x86_64\)/,""):删除该行中Linux x86_64)之前的所有内容sub(/^ /,""):移除处理后行首的空格print:输出最终结果
内容的提问来源于stack exchange,提问作者albertkao9
相关产品推荐
相关产品推荐

