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 -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 키의 문자는 단지 토큰일 뿐이고 실제로 데이터의 일부가 아니며 두 값을 두 개의 별도 셸 변수로 읽어들이고 싶다고 가정 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그런 다음 평가를 위해 스크립트에서 이를 사용합니다.

관련 정보