シェル上で簡単にjsonを扱う

シェル上で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