解析JSON文件-jq [重复]

问题描述 投票:1回答:2

这个问题在这里已有答案:

整个档案:https://1drv.ms/u/s!AizscpxS0QM4hJpEkp12VPHiKO_gBg

使用此命令我得到一部分(获得最新工作)

jq '.|[ .executions[] | select(.job.name != null) | select(.job.name) ]
     | sort_by(.id)
     | reverse
     | .[0] ' 1.json



{
  "argstring": null,
  "date-ended": {
    "date": "2018-04-03T17:43:38Z",
    "unixtime": 1522777418397
  },
  "date-started": {
    "date": "2018-04-03T17:43:34Z",
    "unixtime": 1522777414646
  },
  "description": "",
  "executionType": "user",
  "failedNodes": [
    "172.30.61.88"
  ],
  "href": "http://172.30.61.88:4440/api/21/execution/126",
  "id": 126,
  "job": {
    "averageDuration": 4197,
    "description": "",
    "group": "",
    "href": "http://172.30.61.88:4440/api/21/job/271cbcec-5042-4d52-b794-ede2056b2ab8",
    "id": "271cbcec-5042-4d52-b794-ede2056b2ab8",
    "name": "aa",
    "permalink": "http://172.30.61.88:4440/project/demo/job/show/271cbcec-5042-4d52-b794-ede2056b2ab8",
    "project": "demo"
  },
  "permalink": "http://172.30.61.88:4440/project/demo/execution/show/126",
  "project": "demo",
  "status": "failed",
  "user": "administrator"

我设法提取工作名称和状态,现在想获得date-ended.date?

jq '.|[ .executions[] |select(.job.name != null) | select(.job.name) ]
     | sort_by(.id)
     | reverse 
     | .[0]
     | "\(.status), \(.job.name)"' 1.json
bash jq
2个回答
1
投票

使用“-r”命令行选项,可以使用以下过滤器:

 [.executions[] | select(.job.name != null)]
 | sort_by(.id)
 | reverse 
 | .[0]
 | [.status, .job.name, ."date-ended".date]
 | @csv

生产:

"failed","aa","2018-04-03T17:43:38Z"

您可能错过的重要一点是“ - ”是一个“特殊”字符,因为它可以表示否定或减法。

如果你的jq不支持语法."date-ended".date,那么你可以回到基本语法:(.["date-ended"] | .date)


0
投票

我猜你有麻烦提取.date-ended.date,因为该名称包含一个由jq解释为减法的破折号。

解决方案列在documentation中:

如果键包含特殊字符,则需要用双引号将其括起来:."foo$",否则.["foo$"]

这意味着你的jq程序的最后一个过滤器应该是:

"\(.status), \(.job.name), \(."date-ended".date)"
© www.soinside.com 2019 - 2024. All rights reserved.