如何按测试用例名称命名csplit分割后的日志文件
按测试用例名称分割log文件的解决方案
你可以用awk直接完成这个需求,不需要依赖sed+csplit的组合,它能在处理文件时动态提取测试用例名称并生成对应命名的文件,一步到位。
基础命令实现
直接在终端运行以下命令即可:
awk ' /START_TEST_CASE/ { # 提取测试用例名称(适配"START_TEST_CASE tst_T01-TC02"这类格式) match($0, /START_TEST_CASE ([^ ]+)/, case_arr) filename = case_arr[1] ".log" print "正在处理测试用例:" filename > "/dev/stderr" } /START_TEST_CASE/,/END_TEST_CASE/ { # 将当前测试用例的内容写入对应文件 print >> filename } END { print "所有测试用例分割完成。" > "/dev/stderr" }' test.log
命令细节说明
提取测试用例名称:
- 用
match()函数通过正则捕获START_TEST_CASE后面的名称部分,([^ ]+)匹配空格前的所有字符;如果你的行格式是START_TEST_CASE: 带空格的名称,可以把正则改成START_TEST_CASE: (.+)来适配。 - 生成的文件名格式为
测试用例名称.log。
- 用
写入对应文件:
- 使用范围模式
/START_TEST_CASE/,/END_TEST_CASE/匹配整个测试用例块,将每行内容追加到对应文件(用>>是追加逻辑,若要覆盖已有同名文件,改成>即可)。 - 输出到
/dev/stderr的内容是终端提示信息,不会混入分割后的log文件。
- 使用范围模式
特殊情况处理
如果测试用例名称包含空格、斜杠、冒号等特殊字符,会导致文件创建失败,可以在生成文件名时替换这些字符:
awk ' /START_TEST_CASE/ { match($0, /START_TEST_CASE ([^ ]+)/, case_arr) filename = case_arr[1] ".log" # 将特殊字符替换为下划线,避免文件创建错误 gsub(/[\/: ]/, "_", filename) print "正在处理测试用例:" filename > "/dev/stderr" } /START_TEST_CASE/,/END_TEST_CASE/ { print >> filename } END { print "所有测试用例分割完成。" > "/dev/stderr" }' test.log
对比原方法的优势
原csplit只能按分割位置生成编号文件,无法直接关联测试用例名称;而awk可以在处理每个测试用例块时动态获取名称,直接生成符合需求的命名文件,流程更简洁,省去了后续手动重命名的步骤。
内容的提问来源于stack exchange,提问作者Sync
相关产品推荐
相关产品推荐

