如何使用JQ将JSON数据转换为终端可读的格式化表格?
问题描述
刚接触Bash脚本,了解到可以用jq处理JSON数据,但试了多种jq写法,一旦数据内容变化,生成的表格格式就会混乱,可读性极差。目前使用的jq命令如下:
echo "$(jq -r '[(.Results[].Vulnerabilities[] | {VulnerabilityID,PkgName,Severity,InstalledVersion,FixedVersion})] | ["VulnerabilityID","PkgName"," Severity","InstalledVersion","FixedVersion"], ["---------------","-------", " -------", "----------------", "------------"], (.[] | [.VulnerabilityID, .PkgName, .Severity, .InstalledVersion, .FixedVersion]) | @tsv' json.json)" >> output.txt
需要将目标JSON数据转换为终端可读的整齐表格,期望输出格式如下:
VulnerabilityID PkgName Severity InstalledVersion FixedVersion --------------- ------- ------- ---------------- ------------ CVE-2021-33910 libsystemd0 HIGH 237-3ubuntu10.43 237-3ubuntu10.49 CVE-2021-33910 libudev1 HIGH 237-3ubuntu10.43 237-3ubuntu10.49
解决方法
你之前的写法靠手动给表头加空格、写死分隔线长度来对齐,一旦字段内容长度变化,表格必然错位。正确的思路是用jq输出结构化的制表符分隔内容,再借助column命令自动根据内容宽度对齐,适配任何数据长度。
修改后的命令如下:
jq -r ' .Results[].Vulnerabilities[] | [.VulnerabilityID, .PkgName, .Severity, .InstalledVersion, .FixedVersion] | ["VulnerabilityID", "PkgName", "Severity", "InstalledVersion", "FixedVersion"] as $headers | $headers, ($headers | map("-"*length)), . | @tsv ' json.json | column -t -s $'\t' >> output.txt
关键改进点:
- 自动适配分隔线:通过
map("-"*length)根据表头的长度自动生成对应长度的横线,不用手动写死固定长度的分隔符。 - 动态对齐:
@tsv输出制表符分隔的原始内容,再用column -t命令自动按列对齐,确保无论字段内容长短,表格始终整齐。 - 简化字段提取:直接提取字段组成数组,省去了先转对象再拆数组的冗余步骤。
执行这条命令后,就能得到和你期望完全一致的可读性表格,且数据变化时不会再出现格式混乱的问题。
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

