중첩된 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
그런 다음 평가를 위해 스크립트에서 이를 사용합니다.