jsonの変数に格納されているキー値をgrep /印刷する方法は?

jsonの変数に格納されているキー値をgrep /印刷する方法は?

入れ子になったjsonを含む変数があります。

a={"content":[{"JOB_STATUS_ID":283739,"PROGRAM_ID":57,"STATUS":"Completed","**DATA_DATE**":"2017-03-09 00:00:00","**START_TIME**":"2017-03-10 00:46:13","END_TIME":"2017-03-10 00:56:40","TOTAL_ROWS":null,"UPDATED_ROWS":null,"DELETED_ROWS":null,"INSERTED_ROWS":null,"REF1":"NULL","REF2":"NULL","AUD_CREATE_DT":"2017-03-10 00:46:13","AUD_CREATE_USER":"JOB_CONTROL","AUD_MODIFY_DT":"2017-03-10 00:56:40","AUD_MODIFY_USER":"JOB_CONTROL"},

{"JOB_STATUS_ID":109711,"PROGRAM_ID":57,"STATUS":"Completed","DATA_DATE":"2017-01-11 00:00:00","START_TIME":"2017-01-12 16:55:14","END_TIME":"2017-01-12 18:54:51","TOTAL_ROWS":null,"UPDATED_ROWS":null,"DELETED_ROWS":null,"INSERTED_ROWS":null,"REF1":"NULL","REF2":"NULL","AUD_CREATE_DT":"2017-01-12 16:55:14","AUD_CREATE_USER":"JOB_CONTROL","AUD_MODIFY_DT":"2017-01-12}

変数aでネストされたjson(強調表示されているように)の最初のjsonのDATA_DATEとSTART_TIMEをgrepする方法を探しています。

助けが必要ですか?

awk、sed、またはシェルスクリプトを使用できます。

答え1

使用ジャック:

$ echo $a | jq '.[][0]["**DATA_DATE**"]'
"2017-03-09 00:00:00"

jqはすべてのディストリビューションで利用できない可能性があり、直接コンパイルしたくない場合があるため、基本ライブラリでJSONをサポートする他の多くのスクリプト言語を利用できます。

真珠:

$ perl -e "use JSON::Parse 'parse_json'; my \$a = parse_json ('$(echo $a)'); print \$a->{'content'}[0]{'**DATA_DATE**'}"
2017-03-09 00:00:00

Python:

$ python -c "import json; a=json.loads('$(echo $a)'); print(a['content'][0]['**DATA_DATE**'])"
2017-03-09 00:00:00

ルビー:

$ ruby -e "require 'json'; puts JSON.parse('$a')['content'][0]['**DATA_DATE**'];"
2017-03-09 00:00:00

もちろん、標準の*nix(GNU)ツールを使用してこの特定のJSONの例から値を取得できますが、これは本当に不便です。 JSON構造が変更されると、コードが予期せず動作する可能性があります。

答え2

JSONの場合は、次のようにJSONを理解するツールを使用できます。ジャック、awk/sedの代わりに:

$ echo "$a" | jq '.content[0].DATA_DATE'
"2017-03-09 00:00:00"

ほとんどのディストリビューションでも同じですSTART_TIMEジャック包装された形で提供されます。

答え3

私はこのようなことにPerlツアーを使用するのが好きです。

echo $a | grep -oP '(?<=日付**:).*?(?=,)'

そして

echo $a | grep -oP '(?<=START_TIME**:).*?(?=,)'

答え4

**JSONキーの文字はトークンにすぎず、実際にはデータの一部ではなく、2つの値を2つの別々のシェル変数として読みたいと仮定すると、割り当てのシェルdata_dateコードをstart_time生成して評価できます。jqシェル:

a='{ the JSON document }'

eval "$(
    printf '%s\n' "$a" |
    jq -r '.content[0] |
        @sh "data_date=\(.DATA_DATE)",
        @sh "start_time=\(.START_TIME)"'
)" 

printf 'data date  = "%s"\n' "$data_date"
printf 'start time = "%s"\n' "$start_time"

質問のデータが与えられ(最初に修正された)、jqここで呼び出すとシェルコードが生成されます。

data_date='2017-03-09 00:00:00'
start_time='2017-03-10 00:46:13'

eval次に、評価のためにスクリプトでそれを使用します。

関連情報