我需要使用 jq 将 JSON 字符串转换为表格格式,以便在终端中显示输出,如下所示。
{
"results": [
[
{
"field": "@timestamp",
"value": "2023-07-03 08:28:00.000"
},
{
"field": "CpuReserved",
"value": "8192.0"
},
{
"field": "CpuUtilized",
"value": "4056.412942708333"
},
{
"field": "MemoryReserved",
"value": "61440"
},
{
"field": "MemoryUtilized",
"value": "4311"
},
{
"field": "@ptr",
"value": "CpABClUKUTE0NjcxNzAzNzI0NzovYXdzL2Vjcy9jb250YWluZXJpbnNpZ2h0cy9pcmwtaW5mcmEtc2hhcmVkLWplbmtpbnMtbWFpbi9wZXJmb3JtYW5jZRABEjUaGAIGSaxosQAAAAAd+TFeAAZKKHIwAAABEiABKIDF9taRMTDA7v3WkTE4BkC9NEjNPFCBIRgAEAAYAQ=="
}
],
[
{
"field": "@timestamp",
"value": "2023-07-03 08:28:00.000"
},
{
"field": "CpuReserved",
"value": "8192.0"
},
{
"field": "CpuUtilized",
"value": "4056.412942708333"
},
{
"field": "MemoryReserved",
"value": "61440"
},
{
"field": "MemoryUtilized",
"value": "4311"
},
{
"field": "@ptr",
"value": "CpABClUKUTE0NjcxNzAzNzI0NzovYXdzL2Vjcy9jb250YWluZXJpbnNpZ2h0cy9pcmwtaW5mcmEtc2hhcmVkLWplbmtpbnMtbWFpbi9wZXJmb3JtYW5jZRABEjUaGAIGSaxosQAAAAAd+TFeAAZKKHIwAAABEiABKIDF9taRMTDA7v3WkTE4BkC9NEjNPFCBIRgAEAEYAQ=="
}
]
]
}
Run Code Online (Sandbox Code Playgroud)
我想在终端中显示的内容如下:
@timestamp CpuReserved CpuUtilized MemoryReserved MemoryUtilized
==========================================================================================
2023-07-03 08:16:00.000 8192.0 410.5300065104166 61440 1417
2023-07-03 08:15:00.000 8192.0 702.310791015625 61440 792
Run Code Online (Sandbox Code Playgroud)
有人可以引导我走向正确的方向吗?
Sté*_*las 12
或许:
\n$ jq -c \'.results[]|map(.key=.field)|from_entries|del(."@ptr")\' file.json |\n mlr --ijson --opprint --barred cat\n+-------------------------+-------------+-------------------+----------------+----------------+\n| @timestamp | CpuReserved | CpuUtilized | MemoryReserved | MemoryUtilized |\n+-------------------------+-------------+-------------------+----------------+----------------+\n| 2023-07-03 08:28:00.000 | 8192.0 | 4056.412942708333 | 61440 | 4311 |\n| 2023-07-03 08:28:00.000 | 8192.0 | 4056.412942708333 | 61440 | 4311 |\n+-------------------------+-------------+-------------------+----------------+----------------+\n
Run Code Online (Sandbox Code Playgroud)\n如果没有--barred
,看起来像:
\n @\xcc\xb2t\xcc\xb2i\xcc\xb2m\xcc\xb2e\xcc\xb2s\xcc\xb2t\xcc\xb2a\xcc\xb2m\xcc\xb2p\xcc\xb2 C\xcc\xb2p\ xcc \xb2u\xcc\xb2R\xcc\xb2e\xcc\xb2s\xcc\xb2e\xcc\xb2r\xcc\xb2v\xcc\xb2e\xcc\xb2d\xcc\xb2 C\xcc\xb2p\xcc\xb2u\xcc\ xb2U\xcc\xb2t\xcc\xb2i\xcc\xb2l\xcc\xb2i\xcc\xb2z\xcc\xb2e\xcc\xb2d\xcc\xb2 M\xcc\xb2e\xcc\xb2m\xcc\xb2o\xcc\xb2r \xcc\xb2y\xcc\xb2R\xcc\xb2e\xcc\xb2s\xcc\xb2e\xcc\xb2r\xcc\xb2v\xcc\xb2e\xcc\xb2d\xcc\xb2 M\xcc\xb2e\xcc\xb2m \ xcc\xb2o\xcc\xb2r\xcc\xb2y\xcc\xb2U\xcc\xb2t\xcc\xb2i\xcc\xb2l\xcc\xb2i\xcc\xb2z\xcc\xb2e\xcc\xb2d\xcc\xb2\ n2023- 07-03 08:28:00.000 8192.0 4056.412942708333 61440 4311\n2023-07-03 08:28:00.000 8192.0 4056.412942708333 61440 4311\n\n
您还可以将该命令的输出通过管道传输jq
到vd -f json
( VisiData ) 而不是mlr
( Miller ) 以获取交互式表查看器。
它们用于jq
提取信息并且mlr
仅用于格式化表格。的功能集jq
和 的功能集之间存在一些重叠mlr
。例如,您还可以删除@ptr
带有mlr
\'s的列cut
:
jq -c \'.results[]|map(.key=.field)|from_entries\' file.json |\n mlr --ijson --opprint cut -xf @ptr\n
Run Code Online (Sandbox Code Playgroud)\n该jq
命令被分解并评论:
jq -c \'\n .results[] | # iterate over the elements of the .results array \n # (which are also arrays)\n\n map(.key=.field) | # for each of those arrays, transform the\n # elements (which are objects) by adding a \n # field of key "key" with same value as that\n # with "field" key in each, as that\'s what\n # from_entries needs\n\n from_entries | # transforms those [{"key":"foo","value":"bar"}]\n # (the "field" field is ignored) to {"foo":"bar"}\n\n del(."@ptr") # deletes the field with key "@ptr" from those\n # objects\' file.json\n
Run Code Online (Sandbox Code Playgroud)\n结果不是 JSON,而是多个 JSON 连接在一起,但两者jq
都mlr
支持。对于-c
(compact),这就是 NDJSON(换行符分隔的 JSON),其中每行一个 JSON,也受vd
. 为了获得正确的 JSON,我们需要:
jq -c \'.results|map(map(.key=.field)|from_entries|del(."@ptr"))\' file.json\n
Run Code Online (Sandbox Code Playgroud)\nmap
我们在数组上使用它.results
,因此它会生成另一个 JSON 数组,而不是迭代元素。所以最终的结果是一个大数组。这也得到了支持jq
(显然这是正确的 JSON),mlr
并且vd
, 的输入时间有点长,意味着这些工具需要]
在有任何东西可以咀嚼之前读取到最后的结尾。在实践中,我还没有检查这是否对性能产生任何影响。