How to use `jq` in a shell pipeline?
I can't seem to get jq
to behave "normally" in a shell pipeline. For example:
$ curl -s https://api.github.com/users/octocat/repos | jq | cat
results in jq
simply printing out its help text*. The same thing happens if I try to redirect jq
's output to a file:
$ curl -s https://api.github.com/users/octocat/repos | jq > /tmp/stuff.json
Is jq
deliberately bailing out if it determines that it's not being run from a tty? How can I prevent this behavior so that I can use jq
in a pipeline?
Edit: it looks like this is no longer an issue in recent versions of jq
. I have jq-1.6
now and the examples above work as expected.
* (I realize this example contains a useless use of cat; it's for illustration purposes only)
Solution 1:
You need to supply a filter as an argument. To pass the JSON through unmodified other than the pretty printing jq
provides by default, use the identity filter .
:
curl -s https://api.github.com/users/octocat/repos | jq '.' | cat
Solution 2:
One use case I have found myself doing frequently as well is "How do I construct JSON data to supply into other shell commands, for example curl
?" The way I do this is by using the --null-input/-n
option:
Don’t read any input at all! Instead, the filter is run once using
null
as the input. This is useful when usingjq
as a simple calculator or to construct JSON data from scratch.
And an example passing it into curl
:
jq -n '{key: "value"}' | curl -d @- \
--url 'https://some.url.com' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json'