【发布时间】:2018-07-31 15:20:00
【问题描述】:
[注意:问题已根据 cmets 进行了澄清,因此其中一些可能已过时。]
我正在使用 jq 来解析以下 JSON:
[{
"type": "A",
"id": "A",
"name": "A",
"message": "OK",
"updateDate": "2018-07-31T10:55:14.813Z",
"createDate": "2018-07-31T08:01:32.164Z",
"status": "ACTIVE"
}, {
"type": "B",
"id": "B",
"name": "B",
"message": "OK",
"updateDate": "2018-07-31T10:55:16.803Z",
"createDate": "2018-07-31T08:01:34.171Z",
"status": "ACTIVE"
}, {
"type": "C",
"id": "C",
"name": "C",
"message": "OK",
"updateDate": "2018-07-31T10:55:18.607Z",
"createDate": "2018-07-31T08:01:37.181Z",
"status": "ACTIVE"
}, {
"type": "D",
"id": "D",
"name": "D",
"message": "OK",
"updateDate": "2018-07-31T10:55:20.877Z",
"createDate": "2018-07-31T08:01:38.185Z",
"status": "ACTIVE"
}, {
"type": "E",
"id": "E",
"name": "E",
"message": "OK",
"updateDate": "2018-07-31T10:55:18.615Z",
"createDate": "2018-07-31T08:01:44.207Z",
"status": "ACTIVE"
}, {
"type": "F",
"id": "F",
"name": "F",
"message": "OK",
"updateDate": "2018-07-31T10:55:19.131Z",
"createDate": "2018-07-31T08:01:44.207Z",
"status": "ACTIVE"
}, {
"type": "G",
"id": "G",
"name": "G",
"message": "OK",
"updateDate": "2018-07-31T10:55:18.326Z",
"createDate": "2018-07-31T08:01:46.212Z",
"status": "ACTIVE"
}]
为了显示名称和状态,我使用以下命令,其中$input 保存上述 JSON:
output=$(jq '.[] | "\(.name) \(.status)"' <<< "$input")
echo $output
这会产生:
"A: ACTIVE" "B: ACTIVE" "C: ACTIVE" "D: ACTIVE" "E: ACTIVE" "F: ACTIVE" "G: ACTIVE"
如何确保每次迭代产生一个新行,如下所示:
"A: ACTIVE"
"B: ACTIVE"
"C: ACTIVE"
"D: ACTIVE
"E: ACTIVE"
"F: ACTIVE"
"G: ACTIVE"
【问题讨论】:
-
输出已经在新的一行。它不会打印在您声明的同一行
-
我想知道你是否在运行
foo=$(jq ...); echo $foo。在这种情况下,您的echo中缺少引号导致所有内容都显示在一行上;它需要echo "$foo"才能正确显示。 -
...如果是这样,这个问题将与I just assigned a variable, but
echo $variableshows something else重复。 -
您没有向我们展示足以自己重现此内容的事实(因为您没有展示您实际显示输出的方式,这与它的格式化/渲染方式有关)意味着这一点问题缺少minimal reproducible example。理想情况下,我们应该能够从您的问题中复制和粘贴内容而无需进行更改以获得完全相同的输出,因此无需猜测该错误是否“真实”。
-
JSON 格式实际上是一个 docker exec 输出。你是对的,我确实运行 foo=$(jq ...);回声 $foo。很好的收获,谢谢!