You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 20:17:34