쉘 파이프 라인에서`jq`를 사용하는 방법은 무엇입니까?


198

jq쉘 파이프 라인에서 "정상적으로"동작 하지 않는 것 같습니다 . 예를 들면 다음과 같습니다.

$ curl -s https://api.github.com/users/octocat/repos | jq | cat

결과 jq단순히 도움말 텍스트 *을 인쇄. jq의 출력을 파일 로 리디렉션하려고하면 동일한 문제가 발생 합니다.

$ curl -s https://api.github.com/users/octocat/repos | jq > /tmp/stuff.json

되어 jq그것이 터미날에서 실행되지 않고 있다고 판단 할 경우 의도적으로 구제? jq파이프 라인에서 사용할 수 있도록이 동작을 방지하려면 어떻게해야합니까?


* (이 예제에는 쓸모없는 고양이 사용 이 포함되어 있습니다 .

답변:


327

필터를 인수로 제공해야합니다. jq기본적으로 예쁜 인쇄가 아닌 수정되지 않은 상태로 JSON을 전달하려면 ID 필터를 사용하십시오 ..

curl -s https://api.github.com/users/octocat/repos | jq '.' | cat

23
OP가 가지고 있기 때문에 나는 그것을 떠났다. jq파이프에서 읽고 다른 파이프에 쓰는 중임을 나타내는 자리 표시 자 일뿐 입니다. 의 출력을 단순히보고자하는 jq것이라면 cat그 자체는 불필요합니다.
chepner

3
(1) jq 버전 1.5가 향상되었습니다. 이런 경우에는 불필요합니다. (2) "."를 인용 할 필요는 없습니다.
피크

6
@peak 파이프 라인에 필요하지 않을 수도 있지만 1.5가 있고 "."를 제공해야했습니다. 출력을 파일로 리디렉션합니다.
MHarris

2
나는 인용 .내 표준 관행 먼저 무엇을 같은 JSON의 외모 참조 다시 가서 더 자주 못하는 것보다 인용 될 필요가있을 것이다 필터에 추가하기 시작하기 때문에, 습관의 아웃.
chepner

6
@WalterTross 예, 나는 그것을 인용 한 이유를 18 개월 전에 설명했습니다.
chepner

16

자주 사용하는 것으로 확인 된 사용 사례 중 하나는 "예를 들어 다른 쉘 명령에 제공 할 JSON 데이터를 어떻게 구성 curl합니까?"입니다. 내가하는 방법은 --null-input/-n옵션 을 사용하는 것입니다.

입력 내용을 전혀 읽지 마십시오! 대신, null입력으로 필터를 한 번 실행 합니다. jq간단한 계산기로 사용하거나 처음부터 JSON 데이터를 구성 할 때 유용합니다 .

그리고 그것을 전달하는 예제 curl:

jq -n '{key: "value"}' | curl -d @- \
  --url 'https://some.url.com' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json'

9
멋지지만이 질문과 어떻게 관련이 있는지 잘 모르겠습니까?
mgalgs

2
@ mgalgs 필자 jq는 일부 데이터를 필터링하기 위해 중간 / 끝이 아닌 셸 파이프 라인의 시작 부분에서 생성 / 사용하기를 원했습니다 . curl예는 기본이다,하지만 난에 JSON 데이터에 자신 자주 손 입력을 발견 curl나는 그것이 아니라 다른 사람에게 도움이 될 줄 알았는데, 그래서 오른쪽 인용 얻을하려고합니다.
mkobit
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.