【问题标题】:How to split iterations to new lines in jq如何在jq中将迭代拆分为新行
【发布时间】: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 $variable shows something else重复。
  • 您没有向我们展示足以自己重现此内容的事实(因为您没有展示您实际显示输出的方式,这与它的格式化/渲染方式有关)意味着这一点问题缺少minimal reproducible example。理想情况下,我们应该能够从您的问题中复制和粘贴内容而无需进行更改以获得完全相同的输出,因此无需猜测该错误是否“真实”。
  • JSON 格式实际上是一个 docker exec 输出。你是对的,我确实运行 foo=$(jq ...);回声 $foo。很好的收获,谢谢!

标签: json bash jq


【解决方案1】:

[编辑:此回复已根据问题的澄清进行了修订。]

用途:

echo "$output"

如果您的bashmapfile,那么考虑将output 创建为一个bash 数组可能也是值得的:

mapfile -t output < <(jq  '.[] | "\(.name) \(.status)"' <<< "$input" )
printf "%s\n" "${output[@]}"

【讨论】:

  • 我希望 OP 错误地处理了他们的 shell,并以这种方式丢失了换行符(例如运行 var=$(jq ...),然后运行 ​​echo $var;因此与 BashPitfalls #14 发生冲突)。跨度>
  • @Isaac - 解决方法已明确包含 -r。您可能希望删除您的评论以避免混淆。
猜你喜欢
  • 2020-09-13
  • 2018-11-24
  • 2020-03-27
  • 1970-01-01
  • 1970-01-01
  • 2019-09-21
  • 2018-12-27
  • 2011-06-02
  • 1970-01-01
相关资源
最近更新 更多