Unix下如何将含不同分隔符的命令行键值对输出转为CSV文件
AWK实现自定义命令日志转指定CSV格式
核心处理逻辑是通过正则匹配逐个提取目标字段,避开直接按逗号/空格切分导致的字段错位、IsEnabled字段末尾多余.、启动时间含空格无法直接切分的问题。
可直接使用的完整命令
custom-command | awk ' BEGIN { # 输出CSV固定表头 print "current-capacity, buffer, not-used/total, IsEnabled, Up since" } # 跳过命令提示符行、空行等无效内容 /^bash\$/ || /^[[:space:]]*$/ { next } { # 正则匹配逐个提取字段值,自动过滤多余符号 match($0, /current-capacity: ([^,]+)/, cap) match($0, /buffer: ([^,]+)/, buf) match($0, /not-used\/total: ([^,]+)/, ratio) match($0, /IsEnabled: ([0-9]+)\./, en) match($0, /Up since (.*)$/, uptime) # 按要求格式拼接输出 printf "%s, %s, %s, %s, %s\n", cap[1], buf[1], ratio[1], en[1], uptime[1] }'
使用说明
- 命令会自动跳过开头的命令提示符行、输出中的空行,不会将无效内容写入结果
- 正则匹配逻辑不依赖字段固定位置,后续如果日志字段顺序微调,只要键名不变就可以正常解析
- IsEnabled字段的提取规则会自动忽略值末尾的
.,不需要额外做字符串替换 - 如果需要将结果持久化到CSV文件,直接在命令末尾加重定向即可:首次写入用
> 目标文件路径覆盖写(保留表头),后续定期追加写入用>> 目标文件路径即可。
注:你给出的目标CSV示例存在几处笔误(如第二行not-used/total写为25/、第三行字段值和原始日志不匹配),上述命令会严格提取原始日志中的真实字段值,符合结构化入库的要求。
内容的提问来源于stack exchange,提问作者RKR
相关产品推荐
相关产品推荐

