2017-01-27 7 views
-1

複雑なjsonファイルが4番目と5番目のレベルにネストされており、以下の結果をjqを使用して取得しようとしています。どんな助けも認められるでしょう:jqを使用して複雑なJSONファイルからシンプルなJSONデータファイルを取得する方法

これは、私がinspecプロファイルを実行した結果として得られるjsonファイルです。実際の目的は、必要な情報を単純なjsonに抽出して、最終的にAWS Redshiftデータベースを更新できるようにすることです。

{ 
    "version": "1.7.1", 
    "profiles": [{ 
    "name": "java", 
    "title": "InSpec Java in system", 
    "maintainer": "awim", 
    "copyright": "awim/mtaqwim", 
    "copyright_email": "[email protected]", 
    "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 
    } 
} 
+1

あなたはa)の簡略化JSONへ行くべきかを正確に記述する必要があり、そしてb)その代わりに誰かを期待しての、失敗したどのようにあなたがそれを抽出しようとした方法を示し、あなたのためのコードを書く。 –

+0

@ user5188385 - 安心して、あなたの仕事には最適な選択です。基本を学び、さらに具体的な質問がある場合は、http://のガイドラインに従って、検証可能な最小限の例を提供することをお勧めします。 – peak

+0

最初のコードブロックは、name、title、desc、complex json(2番目のコードブロック内)の結果です。このコードをhttps://jqplay.org/のcomplex jsonで試してみましょう:.profiles [0] .name、.profiles [0] .controls []。title、.profiles [0] .controls []。results [] .status – user5188385

答えて

1

これを平滑化するフィルタはjqです。フィルタ間の「配管」は、必須であることに注意してください。子配列を平坦化する前に、各親配列を平坦化する必要があります。または、それらのすべてのカーテシアン積が得られます(は非常にです)。

jq '.profiles[] 
    | { Name: .name , Controls: .controls[] } 
    | { Name: .Name, Desc: .Controls.desc , Title: .Controls.title , Results: .Controls.results[] } 
    | { Name: .Name, Desc: .Desc , Title: .Title , StartTime: .Results.start_time , RunTime: .Results.run_time , Result: .Results.status }' 

改行がわかりやすくするためにコードに追加

出力:あなたはそれを平らにしたら

{ 
    "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 

これははるかに私が代わりにそれが可能になるようCSVとして保存検討しますRedshiftにロードする方がややシンプルです。

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 ' 

出力:

"\"java\",\"identify java in PATH system\",\"identify java in system\",\"2017-01-20 05:04:47 +0000\",0.000895896,\"passed\"" 
…etc 
+1

多くの感謝のジョー。これはまさに私が探していたものです。またRedshiftにロードする前にcsvとして保存するヒントをありがとう。 – user5188385

関連する問題