단어나 문자열이 들어가는 전체 줄을 제공하는 것처럼 jq를 사용하여 출력을 얻는 방법

단어나 문자열이 들어가는 전체 줄을 제공하는 것처럼 jq를 사용하여 출력을 얻는 방법

내 질문은 다소 비슷하지만 여전히 자세히 설명할 수 있습니다. 날씨 정보를 얻을 수 있는 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

관련 정보