入れ子になった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
次に、評価のためにスクリプトでそれを使用します。