はじめに
CURLコマンド等で外部からデータを取得する際、データ形式がJSONで提供されることがあります。
{"Rankings":[{"Ranking":{"genre":"all","title":" ...
上記のように単純なgrepでは値を抜き出しづらいですが、専用ツールを利用すると値を簡単に抜き出すことができます。
本記事ではそのコマンドとしてjq及びjidを紹介します。
環境情報
- Debian GNU/Linux 9 (stretch)
jidコマンド
インストール
$ apt-get install jid ... $ which jid /usr/bin/jid
利用
json incremental diggerの略で、その名の通りインタラクティブにjsonを掘るように探索できます。
$ cat hoge.json | jid
とjsonファイルを入力すると整形された状態で画面がフィルターモードに遷移します。
そのフィルター部分に値を入れると自由に値を絞れます。例えば以下では.Rankingまで値を入れていますが
[Filter]> .Ranking { "Rankings": [ { "Ranking": { "genre": "all", "hotels": [
ここで最後のsを入れると以下のように一階層もぐれます。
[Filter]> .Rankings[0] [ { "Ranking": { "genre": "all", "hotels": [
最後まで値を入れると絞り切って値が表示されます。
[Filter]> .Rankings[0].Ranking.genre "all"
jqコマンド
インストール
$ apt-get install jq ... $ which jq /usr/bin/jq
引数を使わず利用するjidとは対照的にjqコマンドではオプションが数多く存在します。
jq [options...] filter [files...]
利用
jqコマンドにてjidで取得したフィルターをそのまま利用することができます。
例えば上記のJSONファイルをcatコマンドで表示してパイプで以下のように渡せば
hoge.json | jq .Rankings[0].Ranking.genre "all"
値が取得できます。
jidコマンドはviのように画面が遷移してしまうのでシェル等では利用できませんが、jqコマンドはワンライナーやシェルからも呼び出せるためgrepの代わりに利用することができます。
終わりに
使い方としては、jidコマンドでjsonファイルのフィルターを作成し、それをjqコマンドで利用することで欲しい値を取り出します。
以上、ご参考になれば幸いです。