シェル上でjsonをパースして他のコマンドに渡したり綺麗に表示したいときがある
そのためのコマンドとしてjqというのがあったためメモ
公式ページはこちら
http://stedolan.github.io/jq/
サンプルとして以下の天気情報のapiを叩いてjsonデータを取得する
OpenWeatherMap - actual and forecast weather.
$ curl "http://api.openweathermap.org/data/2.5/weather?q=Tokyo,jp" > weather.json
中身はこんな感じ
{"coord":{"lon":139.69,"lat":35.69},"sys":{"type":1,"id":7619,"message":0.0956,"country":"JP","sunrise":1418247647,"sunset":1418282892},"weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04n"}],"base":"cmc stations","main":{"temp":282.54,"pressure":1006,"humidity":71,"temp_min":280.15,"temp_max":285.15},"wind":{"speed":1.5,"deg":50,"var_beg":10,"var_end":80},"clouds":{"all":75},"dt":1418299200,"id":1850147,"name":"Tokyo","cod":200}
以下のようにいろいろ操作が可能
$ cat weather.json | jq .coord { "lon": 139.69, "lat": 35.69 } $ cat weather.json | jq .coord.lon 139.69 空白や特殊文字を使う場合はシングルウォートが必要 $ cat weather.json | jq '.coord.lon, .coord.lat' 139.69 35.69 配列の全要素を取り出す $ cat weather.json | jq '.weather[]' { "id": 803, "main": "Clouds", "description": "broken clouds", "icon": "04n" } jsonを作り変えることもできる $ cat weather.json | jq '{id: .id, name: .name}' { "id": 1850147, "name": "Tokyo" } 文字列をダブルクォー卜なしで出力 $ cat weather.json | jq -r '.name' Tokyo
他にもたくさんのことができるようなので詳しくはマニュアルを
jq Manual