JQ 및 bash 스크립트를 사용하여 JSON 요청 필터링

JQ 및 bash 스크립트를 사용하여 JSON 요청 필터링

다음 내용이 포함된 JSON을 Twitch에 요청합니다. curl --silent -H 'Accept: application/vnd.twitchtv.v3+json' -X GET https://api.twitch.tv/kraken/streams/$1내 기능을 위해 보내는 입력은 어디에 있습니까?$1

이제 내 목표는 컬 이후에 JSON을 파이핑하여 필터링하는 것입니다. | jq '.stream.channel.something' jq 필터링을 통해 3가지 다른 문자열 값을 얻으려고 하는데 이 수준까지 관리할 수 있습니다.

{
    "first": "lor"
    "second": "em"
    "third": "ipsum"
}

코드에서 이를 조작하는 방법은 무엇입니까?


제가 생각해낸 대안은 다음과 같습니다.

  1. 컬의 출력을 생성하고 필터링한 후 삭제합니다.
  2. 3개의 cURL 요청 보내기 - (쓸데없는 성능 소모?)

답변1

앞서 말했듯이 저는 json이나 jq에 대해 잘 모르지만 jq를 사용하여 예제 출력을 구문 분석할 수는 없습니다.

{
    "first": "lor"
    "second": "em"
    "third": "ipsum"
}

parse error: Expected separator between values at line 3, column 12

그래서 입력을 다음과 같이 변경했습니다.

{
  "stream" : {
    "channel" : {
      "something" : {
        "first": "lor",
        "second": "em",
        "third": "ipsum"
      }
    }
  }
}

...jq에 대한 귀하의 통화에서 제가 수집한 내용을 기반으로 합니다. 이것이 컬 명령의 출력과 유사하기를 바랍니다.

그렇다면 다음 순서가 귀하의 요구 사항을 충족하는 것 같습니다.

# this is just your original curl command, wrapped in command substitution,
# in order to assign it to a variable named 'output':
output=$(curl --silent -H 'Accept: application/vnd.twitchtv.v3+json' -X GET https://api.twitch.tv/kraken/streams/$1)

# these three lines take the output stream from above and pipe it to
# separate jq calls to extract the values; I added some pretty-printing whitespace
first=$( echo "$output" | jq '.["stream"]["channel"]["something"]["first"]' )
second=$(echo "$output" | jq '.["stream"]["channel"]["something"]["second"]')
third=$( echo "$output" | jq '.["stream"]["channel"]["something"]["third"]' )

결과:

$ echo $first
"lor"
$ echo $second
"em"
$ echo $third
"ipsum"

답변2

파일이 유효한 JSON이라고 가정합니다(질문의 데이터는 그렇지 않습니다).

{
  "first": "lor",
  "second": "em",
  "third": "ipsum"
}

jq이를 사용하여 셸에서 안전하게 평가할 수 있는 세 가지 할당을 생성 할 수 있습니다 .

eval "$(
    jq -r '
        @sh "first=\(.first)",
        @sh "second=\(.second)",
        @sh "third=\(.third)"' file.json
)"

@shin 연산자는 쉘의 계산을 위해 jq양식에 할당을 출력합니다 .first='lor'

bash셸 의 경우 배열 할당을 생성할 수도 있습니다.

eval "$(
    jq -r '@sh "array=(\([.first, .second, .third]))"' file.json
)"

여기서 jq명령은 다음과 같은 것을 생성합니다 array=('lor' 'em' 'ipsum'). 평가 시 bash주어진 내용으로 호출되는 배열이 생성됩니다.array

jq문을 사용하여 @sh "array=(\([.[]]))"각 값이 스칼라라고 가정하고 모든 키 값의 배열을 만들 수 있습니다.

관련 정보