JSON処理コマンド jq を使ってみた

Pocket

最近AWS Management ConsoleからEC2インスタンスを起動するよりも、APIから起動するほうが慣れたら手軽なことがわかりました。
そこでawscliを使うようになりました。ただ、このコマンド、JSONを出力するのですが出力がとても長いのです。
そこで出力されたJSONからほしい情報だけを抽出するのによくjqというsedやgrepに似たストリームエディタ的なコマンドを使うらしいということを知りました。
そのインストール方法と簡単な使い方について。

(2017-12-21 追記)
最近では AWS CLI でも標準で出力フィルタをかけることができるようになっているので、そちらを使うのが筋のようです。
それ以外の REST Web API を叩く場合に使うと良いでしょう。 KONG とか。

インストール

ポータブルCで書かれているから他のライブラリ、モジュールに依存していないのでバイナリ一個落としてくればいいそうです。
こちらのほうが簡単でいいですね。

ディストリビューションのパッケージでインストールする

たぶん、というか今はこれが一番カンタンにインストールできますし、メンテが容易です。
yum なり、 apt-get(apt) なり brew なり好きなもの使って入れてください。

バイナリのまま

CentOS 6.4

公式サイトからダウンロードします。

curl -o /usr/bin/jq http://stedolan.github.io/jq/download/linux64/jq
chmod +x /usr/bin/jq
which jq

動作確認します。テスト用のJSONを流し込んで整形させてみます。色付けもしてくれます。

echo '{"attr_a": ["1", "2", "3"]}' | jq '.'
{
  "attr_a": [
    "1",
    "2",
    "3"
  ]
}

すばらしいですね。

Mac OS X

Homebrewで一発インストールです。

brew install jq

Windows

動作確認していませんが、Windows上でもjqは使えるようです。(Download jq)

  • http://stedolan.github.io/jq/download/win64/jq.exe
  • http://stedolan.github.io/jq/download/win32/jq.exe

対応するバイナリをダウンロードしてパスが通っているところにおいて実行するのでしょうか。

ビルドする方法

最初はビルドしてインストールするのがデフォルトなのかと思ったのですが、
こっちはすぐにビルドしたい奇特な人向けの方法のようです。

参考のサイトではそのままmakeできているのですが、今はやり方が少し変わっているようです。
クローンした時点ではMakefileがないので、Autotools(autoconf + automake)をインストールしないとconfigure, Makefileを生成できません。当然ですが、そのままビルドしようとするとMakefile自体が存在しないのでエラーになります。

[root@localhost jq]# make
make: *** ターゲットが指定されておらず, makefile も見つかりません.  中止.

Amazon Linux, CentOSにインストール

CentOSの場合はデフォルトではsudoを使わないことに注意します。CentOSの場合はrootユーザーになってください。

sudo yum -y install git gcc make flex bison rake automake libtool
git clone https://github.com/stedolan/jq.git
cd jq/
autoreconf -i
./configure --prefix=/usr
make
sudo make install

使ってみる

たとえば、以下の様なJSONがあったとします。AWSのリージョン情報です。
regions.json として保存します。

{
    "Regions": [
        {
            "Endpoint": "ec2.eu-west-1.amazonaws.com", 
            "RegionName": "eu-west-1"
        }, 
        {
            "Endpoint": "ec2.sa-east-1.amazonaws.com", 
            "RegionName": "sa-east-1"
        }, 
        {
            "Endpoint": "ec2.us-east-1.amazonaws.com", 
            "RegionName": "us-east-1"
        }, 
        {
            "Endpoint": "ec2.ap-northeast-1.amazonaws.com", 
            "RegionName": "ap-northeast-1"
        }, 
        {
            "Endpoint": "ec2.us-west-2.amazonaws.com", 
            "RegionName": "us-west-2"
        }, 
        {
            "Endpoint": "ec2.us-west-1.amazonaws.com", 
            "RegionName": "us-west-1"
        }, 
        {
            "Endpoint": "ec2.ap-southeast-1.amazonaws.com", 
            "RegionName": "ap-southeast-1"
        }, 
        {
            "Endpoint": "ec2.ap-southeast-2.amazonaws.com", 
            "RegionName": "ap-southeast-2"
        }
    ]
}

まずはこのJSONファイルを整形させてみます。実行するプラットフォームはどこでも大丈夫だと思います。

cat regions.json | jq '.'

jq_highlight

ちゃんと色分けされ、インデントも調整されて出力されます。
これだけでもすごいのですが、まだ jq の本来の目的には到達していません。
これのRegionNameの部分がほしいときは以下のようにします。

$ cat regions.json | jq '.Regions [] .RegionName'
"eu-west-1"
"sa-east-1"
"us-east-1"
"ap-northeast-1"
"us-west-2"
"us-west-1"
"ap-southeast-1"
"ap-southeast-2"

ほしいところだけが綺麗にとってこれました。

参考文献

投稿者紹介

株式会社ユニキャスト
私たちは、テクノロジに魅せられた個性あふれるメンバーによって構成された茨城県日立市に本社を構えるベンチャー企業です。
”テクノロジを通して「驚き」と「感動」を創造し、人々の「夢」と「笑顔」を支えます。” の経営理念をモットーに明るい未来を描き、ワクワクする企画提案を続けて参ります。

2件のコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください