Grep表示JSON对象中的名称 - 值对

时间:2017-12-01 09:16:07

标签: json bash unix grep

在Unix上运行一个shell脚本,该脚本通过一系列JSON对象,如下所示,收集<init>() @ JSONInputData.java:82之类的值。还有其他对象需要检索其他值。

是否有一个更好的选择,而不是为"STACKTRACE_LINE",\n\s*.*加注,然后将结果分开?

inb4:“将X包添加到操作系统”。需要一般地运行。

. . .
"probableStartLocationView" : {
  "lines" : [ {
    "fragments" : [ {
      "type" : "STACKTRACE_LINE",
      "value" : "<init>() @ JSONInputData.java:82"
    } ],
    "text" : "<init>() @ JSONInputData.java:82"
  } ],
  "nested" : false
},
. . . .

如果我在以下一系列对象中寻找"description" : "Dangerous Data Received"该怎么知道我需要知道它与事件12345相关联而不是与同一文件中列出的其他事件相关联?

. . .
"events" : [ {
  "id" : "12345",
  "important" : true,
  "type" : "Creation",
  "description" : "Dangerous Data Received",
  . . .

1 个答案:

答案 0 :(得分:1)

  

有没有比选择“STACKTRACE_LINE”更好的选项,\ n \ s *。*然后拆分结果?

是。使用jq过滤和提取有趣的部分。

示例1,给定此JSON:

{
  "probableStartLocationView": {
    "lines": [
      {
        "fragments": [
          {
            "type": "STACKTRACE_LINE",
            "value": "<init>() @ JSONInputData.java:82"
          }
        ],
        "text": "<init>() @ JSONInputData.java:82"
      }
    ],
    "nested": false
  }
}

提取value type为“STACKTRACE_LINE”:

jq -r '.probableStartLocationView.lines[] | .fragments[] | select(.type == "STACKTRACE_LINE") | .value' file.json

这将每value生成一行。

示例2,给定此JSON:

{
  "events": [
    {
      "id": "12345",
      "important": true,
      "type": "Creation",
      "description": "Dangerous Data Received"
    }
  ]
}

提取id description以“危险”开头的地方:

jq -r '.events[] | select(.description | startswith("Dangerous")) | .id'

等等。 有关更多示例和功能,请参阅jq manual。 关于使用jq的Stack Overflow还有很多问题, 这应该可以帮助您找到过滤和提取相关部分的正确组合。