다음 내용이 포함된 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"
}
코드에서 이를 조작하는 방법은 무엇입니까?
제가 생각해낸 대안은 다음과 같습니다.
- 컬의 출력을 생성하고 필터링한 후 삭제합니다.
- 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
)"
@sh
in 연산자는 쉘의 계산을 위해 jq
양식에 할당을 출력합니다 .first='lor'
bash
셸 의 경우 배열 할당을 생성할 수도 있습니다.
eval "$(
jq -r '@sh "array=(\([.first, .second, .third]))"' file.json
)"
여기서 jq
명령은 다음과 같은 것을 생성합니다 array=('lor' 'em' 'ipsum')
. 평가 시 bash
주어진 내용으로 호출되는 배열이 생성됩니다.array
이 jq
문을 사용하여 @sh "array=(\([.[]]))"
각 값이 스칼라라고 가정하고 모든 키 값의 배열을 만들 수 있습니다.