중첩된 json이 포함된 변수가 있습니다.
a={
"version": "3.0",
"user": "unknown_unknown",
"dateGenerated": "2020-07-08T11:53:23Z",
"status": "OK",
"data": [
{
"parameter": "t_2m:C",
"coordinates": [
{
"lat": 39.23054,
"lon": 9.11917,
"dates": [
{
"date": "2020-07-08T15:53:23Z",
"value": 25.1
}
]
}
]
}
]
}
변수 내의 중첩된 json에서 "값"(강조 표시된 값과 같은)을 grep하는 방법을 찾고 있습니다 a
.
사용 중인데 grep
값 jq
을 표시할 수 없습니다. "날짜"( echo $result | grep -Po '"dates":.*?[^\\],.*?[^\\]"'
)가 표시되지만 값만 표시되는 것은 아닙니다.
도움이 필요하세요?
답변1
("날짜" 배열의 첫 번째 개체)에서 ("좌표" 배열의 첫 번째 개체)에서 ("데이터" 배열의 첫 번째 개체)의 "값"이 필요합니다.
$ a='{"version":"3.0","user":"unknown_unknown","dateGenerated":"2020-07-08T11:53:23Z","status":"OK","data":[{"parameter":"t_2m:C","coordinates":[{"lat":39.23054,"lon":9.11917,"dates":[{"date":"2020-07-08T15:53:23Z","value":25.1}]}]}]}'
$ echo "$a" | jq -r '.data[0].coordinates[0].dates[0].value'
25.1
답변2
설치를 고려할 수도 있습니다.gron
, "JSON을 grepable로 만드는" 유틸리티입니다!
a
귀하의 질문에 정의된 대로 ,
echo $a | gron
반품
json.data = [];
json.data[0] = {};
json.data[0].coordinates = [];
json.data[0].coordinates[0] = {};
json.data[0].coordinates[0].dates = [];
json.data[0].coordinates[0].dates[0] = {};
json.data[0].coordinates[0].dates[0].date = "2020-07-08T15:53:23Z";
json.data[0].coordinates[0].dates[0].value = 25.1;
json.data[0].coordinates[0].lat = 39.23054;
json.data[0].coordinates[0].lon = 9.11917;
json.data[0].parameter = "t_2m:C";
json.dateGenerated = "2020-07-08T11:53:23Z";
json.status = "OK";
json.user = "unknown_unknown";
json.version = "3.0";
이렇게 하면 처리하기가 쉬워집니다.
$ echo $a | gron | sed -n '/value/{s/.* //; s/;//; p;}'
25.1
$ echo $a | gron | awk '/value/ {sub(/;/,""); print $NF;}'
25.1
답변3
사용밀러, 기본 JSON 배열 병합:
$ mlr --ijson --onidx cut -f 'data:0:coordinates:0:dates:0:value' <<<"$a"
25.1
또는 평면화된 요소 이름과 일치하는 정규식
$ mlr --ijson --onidx cut -r -f 'value$' <<<"$a"
25.1