[index][raw][main] [noise@unvalidatedinput]$ man jq jq(1) User Manuals jq(1) NAME jq Sun Oct 8 16:16:06 BST 2017 DESCRIPTION jq can transform JSON in various ways, by selecting, iterating, reducing and otherwise mangling JSON documents. It reads a stream of JSON entities from stdin and coupled with other Unix command line tools like curl, grep, awk, sed allows a quick manipulation of APIs. Cheatsheet ‐‐‐‐‐‐‐‐‐‐ [], {} array/object construction length length of a value keys keys in an array , feed input into multiple filters | pipe output of one filter to the next filter select(foo) input unchanged if foo returns true map(foo) invoke filter foo for each input if‐then‐else‐end conditionals \(foo) string interpolation Let’s get JSON weather data from Open Weather Map API $ json=$(curl ‐s ’https://samples.openweathermap.org/data/2.5/forecast?id=524901&appid=1’) The returnet data is not human readable as the response is minified and returned in a single line $ echo $json | head ‐c 100 {"cod":"200","message":0.0036,"cnt":40,"list":[{"dt":1485799200,"main":{"temp":261.45,"temp_min" This is where jq becomes handy. You can quickly format it using jq’s first argument which is a "filter". The dot is perhaps the simplest of all jq filters. It matches the current input. $ echo ${json} | jq . | head { "cod": "200", "message": 0.0036, "cnt": 40, "list": [ { "dt": 1485799200, "main": { "temp": 261.45, "temp_min": 259.086, The builtin function keys, when given json, returns its keys in an array. $ echo ${json} | jq ’keys’ [ "city", "cnt", "cod", "list", "message" ] Now you can filter on keys and display values: $ echo ${json} | jq .city { "id": 524901, "name": "Moscow", "coord": { "lat": 55.7522, "lon": 37.6156 }, "country": "none" } You can nest the keys: $ echo ${json} | jq .city.name "Moscow" Now the list element repeats and we have 40 entries: echo ${json} | jq ’.list | length’ 40 You can list them all selecting a sub key only: echo ${json} | jq .list[].wind | head { "speed": 4.77, "deg": 232.505 } { "speed": 4.76, "deg": 240.503 } { "speed": 4.71, You can selectively list an item, e.g. the last one: $ echo ${json} | jq ’.list[39].wind’ { "speed": 2.47, "deg": 180.501 } You can feed input into mulitple filters with ",": echo ${json} | jq ’.cod, .cnt’ "200" 40 Instant schema: echo ${json} | jq ‐r ’path(..) | map(tostring) | join ("/")’ | head cod message cnt list list/0 list/0/dt list/0/main list/0/main/temp list/0/main/temp_min Linux March 2019 jq(1) [noise@unvalidatedinput]$ ∎