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


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

インストール

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

バイナリのまま

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"

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

参考文献

投稿者紹介

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

人気の記事

コメント

  1. [...] JSON処理コマンド jq を使ってみた | ユニキャストラボ [...]

  2. [...] ではとりあえずjqコマンドがインストールされていて、パスが通っていればすぐに実行可能です。 インストール方法は JSON処理コマンド jq を使ってみた | ユニキャストラボ になります。 [...]

コメントを残す

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

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

PAGE TOP