Jq(1) is a surprisingly powerful command line JSON stream processing tool. I have not used it much, so this post will be a growing collection of random and useful snippets to help me remember.
Create a JSON array of a list of string values, with or without pretty printing
$ echo '"foo" "bar" "b a z"'|jq -s .
[
"foo",
"bar",
"b a z"
]
$ echo '"foo" "bar" "b a z"'|jq -cs .
["foo","bar","b a z"]
The option -s/--slurp
is what makes jq pack the values in an array here. The option -c/--compact-output
toggles pretty printing.
Extract two particular values from the first of multiple deeply nested JSON-objects
$ cat data.json
{
"data": [
{
"id": 1,
"results": [
{
"type": "result",
"objs": [
{
"a": "foo",
"b": "bar"
}
]
}
]
},
{
"id": 2,
"results": [
{
"type": "result",
"objs": [
{
"a": "foo2",
"b": "bar2"
}
]
}
]
}
]
}
$ cat data.json|jq -r '.data[0].results[0].objs[0].a, .data[0].results[0].objs[0].b'
foo
bar
The option -r/--raw-output
causes jq not to quote the extracted string values. Makes use of the values in shell scripts easier.
Filter stream of JSON objects based on some condition
$ cat data.ndjson
{ "id": 1, "color": "red" }
{ "id": 2, "color": "green" }
{ "id": 3, "color": "blue" }
$ cat data.ndjson | jq -s 'map(select(.color == "blue"))'
[
{
"id": 3,
"color": "blue"
}
]
Create JSON from command line arguments
$ jq -n --arg a 1 --arg b 2 '{"a":$a, "b":$b}'
{
"a": "1",
"b": "2"
}
You can declare variables which jq makes available when constructing JSON, as can be seen in the example. The option -n/--null-input
tells jq to not read anything on stdin, just output stuff. Notice that --arg
by default treats values as JSON strings. If you need to encode values of a and b as real numbers in the above example, use --argjson
instead:
$ jq -n --argjson a 1 --argjson b 2 '{"a":$a, "b":$b}'
{
"a": 1,
"b": 2
}