
내 질문은 다소 비슷하지만 여전히 자세히 설명할 수 있습니다. 날씨 정보를 얻을 수 있는 wttr.in이라는 날씨 앱을 방문하고 있습니다. 이것은 쉽게 수행할 수 있습니다 -
$ curl wttr.in/Pune?format=4
이제 기상 관측소가 현재 데이터를 제공하는지 오래된 데이터를 제공하는지 알고 싶습니다. 이를 위해 서버에서 날씨 정보가 마지막으로 업데이트된 시간을 제공하는 j1 형식이라는 형식에 대해 알고 있습니다.
$ curl wttr.in/Pune?format=j1 | less
위 쿼리는 다음과 같은 많은 데이터를 제공합니다.
current_condition": [
{
"FeelsLikeC": "18",
"FeelsLikeF": "65",
"cloudcover": "4",
"humidity": "42",
"localObsDateTime": "2021-11-11 12:20 AM",
"observation_time": "06:50 PM",
"precipInches": "0.0",
"precipMM": "0.0",
"pressure": "1012",
"pressureInches": "30",
"temp_C": "18",
이제 grep을 사용하면 다음과 같은 출력을 얻게 됩니다.
$ curl wttr.in/Pune?format=j1 | grep "localObsDateTime"
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
2 48685 2 1159 0 0 4199 0 0:00:11 --:--:-- 0:00:11 4184 "localObsDateTime": "2021-11-11 12:20 AM",
100 48685 100 48685 0 0 90830 0 --:--:-- --:--:-- --:--:-- 90661
jq가 그것을 멋지게 꾸미고 간단하게 만들 수 있다고 들었습니다. 누군가 어떻게 하는지 말해 줄 수 있나요? 또한 컬 대신 데이터를 가져오는 다른 방법이 있다면 흥미로울 것입니다.
FWIW ja 1.6이 설치되어 있고 bash 버전은 5.1.8입니다.
답변1
그리고 jq
:
curl -s 'http://wttr.in/Pune?format=j1' | jq -r '.current_condition[].localObsDateTime'
산출:
2021-11-11 오전 03:01
답변2
당신은 그것을 사용할 수 있습니다 :
curl wttr.in/Pune?format=j1 | jq '.current_condition[].localObsDateTime'
답변3
JSON 문서에서 키의 정확한 위치를 모르는 경우 localObsDateTime
재귀적으로 검색해야 합니다. 이를 수행한 후 jq
다음 표현식을 사용하여 해당 값을 추출할 수 있습니다.
.. | select(type == "object" and has("localObsDateTime")).localObsDateTime
이는 본질적으로 "문서의 각 개별 항목에 대해 객체이고 이름이 지정된 키가 있는 경우 localObsDateTime
해당 키의 값을 추출합니다"를 의미합니다.
다음과 같이 단축할 수도 있습니다.
.. | .localObsDateTime? // empty
"문서의 각 개별 항목에 대해 localObsDateTime
값이 있으면 추출하고, 존재하지 않거나 값이 이면 null
아무것도 제공하지 마세요"라고 말합니다.
다음과 같이 실행할 수 있습니다.
$ curl -s 'http://wttr.in/Pune?format=j2' |
jq -r '.. | select(type == "object" and has("localObsDateTime")).localObsDateTime'
2021-11-17 12:16 AM
또는,
$ curl -s 'http://wttr.in/Pune?format=j2' |
jq -r '.. | .localObsDateTime? // empty'
2021-11-17 12:16 AM
이 -r
옵션을 jq
사용하면 유틸리티가 JSON 문자열 대신 디코딩된 텍스트 문자열을 반환합니다.
위에서 반환된 값에 유의하세요.모두 localObsDateTime
열쇠. 이들 중 첫 번째만 필요한 경우 jq
대신 다음 표현식을 사용하십시오.
[ .. | select(type == "object" and has("localObsDateTime")).localObsDateTime ][0]
또는,
[ .. | .localObsDateTime? // empty ][0]
그러면 모든 값이 포함된 배열이 생성되고 첫 번째 값이 추출됩니다.
URL에 in을 사용하면 응답에 더 작은 JSON 문서가 생성 j2
됩니다 .j1