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