Amazon redshift 如何使用jq从复杂的JSON文件中获取简单的JSON数据文件

Amazon redshift 如何使用jq从复杂的JSON文件中获取简单的JSON数据文件,amazon-redshift,jq,inspec,Amazon Redshift,Jq,Inspec,我有一个复杂的json文件,嵌套到第4级和第5级,我正在尝试使用jq获得以下结果。如有任何帮助,将不胜感激: { "Name": "unix-global", "Title": "AWS cli should be installed", "desc": "System Package aws-cli should be installed", "result": "passed" } { "Name": "unix-global", "Title": "AWS cli

我有一个复杂的json文件,嵌套到第4级和第5级,我正在尝试使用jq获得以下结果。如有任何帮助,将不胜感激:

{
  "Name": "unix-global",
  "Title": "AWS cli should be installed",
  "desc": "System Package aws-cli should be installed",
  "result": "passed"
} 
{
  "Name": "unix-global",
  "Title": "AWS cli should be installed",
  "desc": "Service besclient should be installed",
  "result": "failed"
}
这是一个json文件,是运行inspec配置文件后得到的。真正的目的是将只需要的信息提取到一个简单的json中,以便最终更新AWS红移数据库

{
  "version": "1.7.1",
  "profiles": [{
    "name": "java",
    "title": "InSpec Java in system",
    "maintainer": "awim",
    "copyright": "awim / mtaqwim",
    "copyright_email": "muhammadtaqwiem@gmail.com",
    "license": "All Rights Reserved",
    "summary": "An InSpec Compliance Profile",
    "version": "0.0.1",
    "supports": [],
    "controls": [{
      "title": "identify java in system",
      "desc": "identify java in PATH system",
      "impact": 0.3,
      "refs": [],
      "tags": {},
      "code": "control 'java-1.0' do\n  impact 0.3\n  title 'identify java in system'\n  desc 'identify java in PATH system'\n\n  describe java_info do\n    it{ should exist }\n    its(:version){ should match '1.7'}\n  end\nend",
      "source_location": {
        "ref": "inspec/java/controls/java_1.0.rb",
        "line": 6
      },
      "id": "java-1.0",
      "results": [{
        "status": "passed",
        "code_desc": "java_info should exist",
        "run_time": 0.000895896,
        "start_time": "2017-01-20 05:04:47 +0000"
      }, {
        "status": "passed",
        "code_desc": "java_info version should match \"1.7\"",
        "run_time": 0.067581113,
        "start_time": "2017-01-20 05:04:47 +0000"
      }]
    }, {
      "title": "run java from specific path",
      "desc": "run java from specific path",
      "impact": 1.0,
      "refs": [],
      "tags": {},
      "code": "control 'java-2.0' do\n  impact 1.0\n  title 'run java from specific path'\n  desc 'run java from specific path'\n\n  describe java_info(java_path) do\n    it{ should exist }\n    its(:version){ should match '1.7'}\n  end\nend",
      "source_location": {
        "ref": "inspec/java/controls/java_2.0.rb",
        "line": 8
      },
      "id": "java-2.0",
      "results": [{
        "status": "skipped",
        "code_desc": "java_info",
        "skip_message": "Can't find file \"/opt/jdk/current\"",
        "resource": "java_info",
        "run_time": 1.6512e-05,
        "start_time": "2017-01-20 05:04:47 +0000"
      }]
    }, {
      "title": "identify java home",
      "desc": "identify java home match to specific path",
      "impact": 0.1,
      "refs": [],
      "tags": {},
      "code": "control 'java-3.0' do\n  impact 0.1\n  title 'identify java home'\n  desc 'identify java home match to specific path'\n\n  describe java_info(java_path) do\n    its(:java_home){ should match java_path}\n  end\nend",
      "source_location": {
        "ref": "inspec/java/controls/java_3.0.rb",
        "line": 8
      },
      "id": "java-3.0",
      "results": [{
        "status": "skipped",
        "code_desc": "java_info",
        "skip_message": "Can't find file \"/opt/jdk/current\"",
        "resource": "java_info",
        "run_time": 6.139e-06,
        "start_time": "2017-01-20 05:04:47 +0000"
      }]
    }],
    "groups": [{
      "title": "which(UNIX)/where(Windows) java installed",
      "controls": ["java-1.0"],
      "id": "controls/java_1.0.rb"
    }, {
      "title": "which(UNIX)/where(Windows) java installed",
      "controls": ["java-2.0"],
      "id": "controls/java_2.0.rb"
    }, {
      "title": "which(UNIX)/where(Windows) java installed",
      "controls": ["java-3.0"],
      "id": "controls/java_3.0.rb"
    }],
    "attributes": []
  }],
  "other_checks": [],
  "statistics": {
    "duration": 0.069669698
  }
}

这里有一个
jq
过滤器,可以将其平坦化。请注意,过滤器之间的“管道”是必不可少的。必须先展平每个父数组,然后再展平它的子数组,否则将得到它们的笛卡尔积(这非常糟糕)

为清晰起见,代码中添加了换行符

输出:

{
  "Name": "java",
  "Desc": "identify java in PATH system",
  "Title": "identify java in system",
  "StartTime": "2017-01-20 05:04:47 +0000",
  "RunTime": 0.000895896,
  "Result": "passed"
}
…etc
"\"java\",\"identify java in PATH system\",\"identify java in system\",\"2017-01-20 05:04:47 +0000\",0.000895896,\"passed\""
…etc
当你把它夷为平地时,我会考虑把它保存为CSV,这样就可以更简单地加载到红移。

 jq '.profiles[] 
     | { Name: .name , Controls: .controls[] } 
     | { Name: .Name, Desc: .Controls.desc , Title: .Controls.title , Results: .Controls.results[] } 
     | [ .Name, .Desc , .Title , .Results.start_time , .Results.run_time , .Results.status ] 
     | @csv '
输出:

{
  "Name": "java",
  "Desc": "identify java in PATH system",
  "Title": "identify java in system",
  "StartTime": "2017-01-20 05:04:47 +0000",
  "RunTime": 0.000895896,
  "Result": "passed"
}
…etc
"\"java\",\"identify java in PATH system\",\"identify java in system\",\"2017-01-20 05:04:47 +0000\",0.000895896,\"passed\""
…etc

你应该a)准确描述简化JSON中应该包含的内容,b)展示你是如何尝试提取它的,以及它是如何失败的,而不是期望有人为你编写代码。@user5188385-请放心,jq是完成任务的最佳选择,因此我建议你学习基础知识,当你有更具体的问题时,根据指南提供一个最小的完整可验证示例,第一个代码块是我期望的结果…名称、标题、描述、复杂json的结果(在第二个代码块中)。请在以下位置使用复杂的json尝试此代码:.profiles[0].name、.profiles[0].controls[].title、.profiles[0].controls[].results[].status非常感谢Joe。这正是我想要的,还有更多。还感谢您在加载到Redshift之前提供的另存为csv的提示。