AWK处理autorep输出生成CSV脚本的问题排查与修正
修正Bash脚本实现autorep输出到正确CSV格式化
问题根源
不同类型作业的autorep输出字段排版存在差异:JOB_A的watch系列字段可能在独立行但未被匹配,JOB_B的command与machine字段可能在同一行导致被合并,原脚本的固定字段匹配逻辑无法适配这些情况。
修正后的脚本
#!/bin/bash JOB_NAME="$1" autorep -j "$JOB_NAME" -q | awk ' BEGIN { # 预定义所有需要捕获的字段,按需扩展 fields["job_name"] = "" fields["watch_file"] = "" fields["watch_interval"] = "" fields["command"] = "" fields["machine"] = "" fields["owner"] = "" FS = ": *" } # 匹配普通键值对行 /^[A-Za-z_]+: / { key = $1 value = substr($0, index($0, ":") + 2) fields[key] = value next } # 处理command与machine合并的行(JOB_B场景) /command: .*machine: / { # 提取command内容 cmd_pos = index($0, "command: ") + 9 machine_pos = index($0, "machine: ") fields["command"] = substr($0, cmd_pos, machine_pos - cmd_pos - 1) # 提取machine内容 fields["machine"] = substr($0, machine_pos + 9) next } # 单独匹配watch系列字段(确保不遗漏) /^watch_file: / { fields["watch_file"] = substr($0, 13) } /^watch_interval: / { fields["watch_interval"] = substr($0, 18) } END { # 输出CSV,若字段含逗号需加双引号,示例如下 printf "\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\"\n", fields["job_name"], fields["watch_file"], fields["watch_interval"], fields["command"], fields["machine"], fields["owner"] } ' > "${JOB_NAME}_output.csv"
核心修正说明
- 预定义字段数组:确保所有可能出现的字段都被初始化,避免CSV列错位,缺失字段输出空值。
- 精准值提取:使用
substr+index替代固定的$n匹配,适配不同行的字段长度变化。 - 场景化匹配:针对JOB_B的合并字段、JOB_A的watch字段分别编写匹配逻辑,覆盖不同作业类型的输出格式。
- CSV格式兼容:输出时用双引号包裹字段,避免字段含逗号导致格式错误。
适配调整建议
- 执行
autorep -j JOB_A -q和autorep -j JOB_B -q,查看实际输出格式,调整AWK中的正则表达式和字符串截取位置。 - 若有其他特殊字段(如
run_window等),添加到fields数组并补充对应匹配逻辑。
内容的提问来源于stack exchange,提问作者NecroCoder
相关产品推荐
相关产品推荐

