如何使用Bash读取CSV多列生成Graphite/Carbon数据插入命令
实现方案
完整可执行脚本
首先在shell中定义你需要的自定义参数,再运行GNU awk(gawk)脚本即可生成符合要求的命令:
# 提前定义你需要的参数 type="替换为实际type值" serial="替换为实际serial值" object="替换为实际object值" # 执行脚本生成命令 gawk -v type="$type" -v serial="$serial" -v object="$object" ' BEGIN { FS = "," } # 处理表头行,存储所有时间格式的列头 NR == 1 { for (i = 3; i <= NF; i++) { gsub(/"/, "", $i) time_col[i] = $i } next } # 处理数据行 { # 去除时间字段的引号 gsub(/"/, "", $2) # 转换时间格式为mktime支持的格式,生成epoch时间戳 split($2, dt_part, /[\/ :]/) epoch = mktime(dt_part[1] " " dt_part[2] " " dt_part[3] " " dt_part[4] " " dt_part[5] " 0") # 遍历所有时间列,输出符合要求的插入命令 for (i = 3; i <= NF; i++) { printf "echo \"perf.%s.%s.%s.%s.TOTAL_IOPS\" \"%d\" \"%d\" | nc \"localhost\" \"2004\"\n", type, serial, object, time_col[i], $i, epoch } } ' 你的文件路径.csv
注意事项
- 依赖说明:该脚本需要使用GNU awk(gawk)运行,用到了
mktime函数实现时间戳转换。macOS默认自带的是BSD版本awk,可通过brew install gawk安装GNU awk后使用 - 执行方式:直接运行上述脚本会输出所有待执行的插入命令,确认命令格式无误后,在脚本末尾追加
| bash即可直接执行写入carbon的操作 - 若你的carbon服务地址/端口不是默认的
localhost:2004,直接修改脚本中nc后的对应参数即可
之前尝试的问题
- Trial1仅遍历输出了表头字段,没有关联后续数据行的时间和对应数值
- Trial2没有处理列头和数据的对应映射关系,也没有做时间转时间戳、生成目标格式命令的逻辑
内容的提问来源于stack exchange,提问作者Indi59
相关产品推荐
相关产品推荐

