如何 grep/打印 json 中存储在变量中的键的值?

如何 grep/打印 json 中存储在变量中的键的值?

我有一个带有嵌套 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}

寻找一种方法来 grep 变量 a 中嵌套 json(如突出显示的)中第一个 json 的 DATA_DATE 和 START_TIME 。

有什么帮助吗?

可以使用 awk、sed 或 shell 脚本。

答案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

当然,您可以(ab)使用标准 *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 环视来处理此类事情

回声 $a | grep -oP '(?<=日期**:).*?(?=,)'

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

答案4

假设**JSON 键中的字符只是标记,实际上并不是数据的一部分,并且您想要将两个值读入两个单独的 shell 变量中,data_date并且start_time,您可以生成jq用于赋值的 shell 代码,然后进行评估在外壳中:

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此处的调用生成 shell 代码

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

eval然后在脚本中使用它进行评估。

相关内容