JQ导出AWS ELB信息CSV报string cannot be csv-formatted错误
JQ提取ELB信息格式化方案
触发string cannot be csv-formatted, only array报错的核心原因是:@csv格式化器要求传入的输入必须是数组类型,原有写法是把三个字段拆成独立的字符串逐个输出,没有将同一条负载均衡器的字段打包为数组,因此类型不匹配。
直接输出标准CSV格式(推荐)
用以下命令即可输出合规的CSV格式,支持自动转义字段内的逗号、引号等特殊字符,可直接导入表格工具处理:
aws elbv2 describe-load-balancers --output json | jq -r ' # 输出CSV表头,不需要可删除下一行 ["DNSName", "LoadBalancerName", "Scheme"], (.LoadBalancers[] | [.DNSName, .LoadBalancerName, .Scheme]) | @csv '
输出效果示例:
"DNSName","LoadBalancerName","Scheme" "DNS-XXXXXXXXXXXXXXXXXXXXXXXX.elb.us-west-1.amazonaws.com","LBNAME-xxxxxxxxx","internal" "DNS-XXXXXXXXXX.elb.us-west-1.amazonaws.com","LBNAME-XXXXXXXXXXXXXXXXXXXXXXXX","internal"
逐字段输出+负载均衡器块间空行分隔
如果不需要CSV格式,只想保留原逐行输出字段的形式、在不同负载均衡器的信息块之间加空行,直接在遍历每个负载均衡器对象时多输出一个空字符串即可,jq输出空字符串时会自动打印空行:
aws elbv2 describe-load-balancers --output json | jq -r '.LoadBalancers[] | .DNSName, .LoadBalancerName, .Scheme, ""'
输出效果和原有格式一致,仅在每个负载均衡器的三个字段后多一个空行做分隔:
DNS-XXXXXXXXXXXXXXXXXXXXXXXX.elb.us-west-1.amazonaws.com LBNAME-xxxxxxxxx internal DNS-XXXXXXXXXX.elb.us-west-1.amazonaws.com LBNAME-XXXXXXXXXXXXXXXXXXXXXXXX internal
注意事项
- 不要手动用
join(",")拼接CSV字符串,一旦字段值中包含逗号、双引号等特殊字符,会直接导致CSV格式错乱,内置@csv是最稳妥的实现方式。 - 空行分隔方案默认会在输出内容末尾多一个空行,日常使用无影响,如果需要严格去掉末尾空行,可以在命令后拼接
| sed '$d'处理。
内容的提问来源于stack exchange,提问作者eramm
相关产品推荐
相关产品推荐

