sudo apt install jq -y
winget install jqlang.jq
jq with winget and opening a new PowerShell session, I found the executable under PS C:\> where.exe jq C:\Users\rene\AppData\Local\Microsoft\WinGet\Packages\jqlang.jq_Microsoft.Winget.Source_8wekyb3d8bbwe\jq.exe
jq [options…] filter [files…]
filter is a program, written in the jq language, that specifies how the input data (JSON format) is transformed for the output. jq will pretty-print its output (but see -c command line option). .num) returns the value of the num element of the JSON object passed to jq (i. e. 42): echo '{
"num": 42,
"txt": "Hello world"
}' | jq .num
echo '{
"foo": ["a", "b", "c"],
"bar": ["d", "e", "f"],
"baz": ["g", "h", "i"]
}' | jq -r 'to_entries[] | select(.value[] == "d") | .key'
bar
"Hello world" or 42) are filters: these disregard their input and produce their own value as output. . | Identity (output is equal to input) (for example echo 11 | jq '(. + 10) * 2' produces 42. |
.. | Recursive descent (similar to XPath // operator) |
.keyName, .["keyName"] | Value JSON object's element whose name is keyName. If followed by question mark (.keyName?, .["keyName"]?), then value evaluates to null if keyName does not exist (rather than outputting an error) |
.[n] | nth element of array. n can be negative to count from the other end (.[-1] is last element) |
.[n:m] | Slice. Can be applied on array or string. |
.[] | All elements (.[]? prevents errors) |
… , … | Comma operator: input is fed to the filter on the left and on the right, output values are concatenated. |
… | … | Pipe operator (similar to the pipe of shells) |
[ elem1, elem2, … ] | Array construction |
{ key: val … } | Object construction |
+, - | |
* | |
/ | |
% | |
length | Returns the number of Unicode codepoints of a string, the number of elements in an array or the number of key/value pairs in an object. length(null) returns 0. |
utf8bytelength | |
keys, keys_unsorted | Returns the keys of an object in an array |
has(key) | |
in | |
map(x), map_values(x) | |
path(expr) | |
del(path_expression) | del removes a key and its associated value from a JSON object. |
getpath(PATHS), setpath(PATHS; VALUE), delpaths(PATHS) | |
to_entries, to_entries[], from_entries, with_entries | |
select(boolean_expression) | |
arrays, objects, iterables, booleans, numbers, normals, finites, strings, nulls, values, scalars | |
empty | |
error(message) | |
halt, halt_error, halt_error(exit_code) | |
$__loc__ | |
paths, paths(node_filter), leaf_paths | |
add | |
any, any(condition), any(generator; condition) | |
all, all(condition), all(generator; condition) | |
flatten, flatten(depth) | |
range(upto), range(from;upto) range(from;upto;by) | |
floor | |
sqrt | |
tonumber, tostring | |
type | |
infinite, nan, isinfinite, isnan, isfinite, isnormal | |
sort, sort_by(path_expression) | |
group_by(path_expression) | |
min, max, min_by(path_exp), max_by(path_exp) | |
unique, unique_by(path_exp) | |
reverse | |
contains(element) | |
indices(s) | |
index(s), rindex(s) | |
inside | |
startswith(str), endswith(str) | |
combinations, combinations(n) | |
ltrimstr(str), rtrimstr(str) | |
explode | |
implode | |
split(str) | |
join(str) | |
ascii_downcase, ascii_upcase | |
while(cond; update) | |
until(cond; next) | |
recurse(f), recurse, recurse(f; condition), recurse_down | |
walk(f) | |
transpose | |
bsearch(x) | |
tojson, fromjson | |
builtins | Returns a list of all built in functions in the format name/arity |
repeat |
fromdateiso8601 | Parses dates in ISO 8601 format, returns number of seconds since the Unix epoch |
todateiso8601 | Reverse of fromdateiso8601 |
fromdate | |
todate | An alias for todateiso8601 |
now | Current time in seconds since Unix epoch |
jq (because jq expects a JSON object) and evaluate now: $ echo '{}' | jq 'now'
1679756466.497302
todateiso8601 so that we get an ISO 8601 formatted string: $ echo '{}' | jq 'now | todateiso8601'
1679756466.497302
"2023-03-25T15:01:06Z"
$ echo '"2022-02-18T14:57:13Z"' | jq 'fromdateiso8601' 1645196233
strptime
strftime
strflocaltime
mktime
gmtime
localtime INDEX(stream; index_expression) | |
JOIN($idx; stream; idx_expr; join_expr) | |
JOIN($idx; stream; idx_expr) | |
JOIN($idx; idx_expr: | |
IN(s) | |
IN(source; s) |
$thisIsAVariable) jq allows to create libraries/modules in .jq files. @ syntax formats and escapes strings. @text
@json
@html
@uri
@csv
@tsv
@sh
@base64
@base64d --version | ||
--seq | Use the application/json-seq MIME type scheme for separating JSON texts in input and output: print an ASCII RS (record separator) character before each value on output and an ASCII LF (line feed) after every output. | |
--stream | Outputarrays of path and leaf values (scalars and empty arrays or empty objects), useful for processing large inptus in conjunction with filtering ("a" becomes [[],"a"] ; [[],"a",["b"]] becomes [[0],[]], [[1],"a"] and [[1,0],"b"]) | |
-s | --slurp | Read entire input string into a large array, then run filter once (Instead of running the filter for each JSON object in the input). |
-R | --raw-input | Input is not treated as JSON; each line is passed to the filter as a string. Combine with --slurp to process entire input as one string. |
-n | --null-input | Run filter once with null as input (for example to construct JSON data from scratch) |
-c | --compact-output | Do not pretty-print output. |
--tab | Use tab rather than two spaces for indentation | |
--indent n | Use the given number of spaces for indentation. | |
-C | --color-output | See also JQ_COLORS environment variable |
-M | --monochrome-output | |
-a | --ascii-output | |
--unbuffered | Flush the output after each JSON object is printed | |
-S | --sort-keys | Output object fields in sorted order |
-r | --raw-output | Strings won't be quoted |
-j | --join-output | Like -r but jq won't print a newline after an output. |
-f filename | --from-file filename | Read filter from filename (like awk's -f option). Apparently, such files allow # for comments |
-Ldirectory | Prepend directory to the search list for modules. If this option is used then no builtin search list is used. | |
-e | -exit-status | |
--arg name value | Pass a value to the jq program as a predefined variable ($name then has the value value) | |
--argjson name JSON-text | ||
--slurpfile variable-name filename | Assigns to content of a JSON document to a variable. | |
--rawfile variable-name filename | Assign content of filename to variable-name. | |
--argfile variable-name filename | Use --slurpfile instead. | |
--args | Remaining arguments are positional string arguments. These are available to the jq program as $ARGS.positional[]. | |
--jsonargs | Remaining arguments are positional JSON text arguments. These are available to the jq program as $ARGS.positional[]. | |
--run-tests [filename] |
$ json='[ {"id": 7, "name": "ABC"}, {"id": 22, "name": "XYZ"}]'
$ echo "$json" | jq -r '.[] | select(.name == "XYZ") | "id = \(.id), name = \(.name)"'
id = 22, name = XYZ
$ read -r id name < <(echo "$json" | jq -r '.[] | select(.name == "XYZ") | "\(.id) \(.name)"' )
$ echo $id
22
$ echo $name
XYZ
$ echo '{"abc def": 42, "ghi/jkl": 99}' | jq ."abc def"
jq: error: syntax error, unexpected def, expecting $end (Unix shell quoting issues?) at <top-level>, line 1:
$ echo '{"abc def": 42, "ghi/jkl": 99}' | jq '."abc def"'
42
@tsv and column in table mode: $echo '[
{"num": 11, "roman": "XI" , "name": "Undecim" },
{"num": 4, "roman": "IV" , "name": "Quattuor"},
{"num": 7, "roman": "VII", "name": "Septem" },
{"num": 5, "roman": "V" , "name": "Quinque" },
{"num": 9, "roman": "IX" , "name": "Novem" }]' |
jq -r '
.[] |
[.roman, .name] |
@tsv' |
column -t -s$'\t'
XI Undecim
IV Quattuor
VII Septem
V Quinque
IX Novem
@csv was less satisfactory because it embeded strings in apostrophes. ~/.jq is a file, it is sourced into the main program. jq installed in C:\Users\rene\AppData\Local\Microsoft\WinGet\Packages\jqlang.jq_Microsoft.Winget.Source_8wekyb3d8bbwe\jq.exe and in Windows Sandbox under C:\Users\WDAGUtilityAccount\AppData\Local\Microsoft\WinGet\Links\jq.exe (In the sandbox after installing it with winget install --id jqlang.jq)