今さらjsonデータを便利に取得するjq コマンドについてまとめてみた

コマンド

step functions とかも使うことが多くなってきたり、json 形式のファイルを最近扱うことがおおくなってきたので、まとめてみます!

まずは、jq コマンドって何ってところから軽く紹介していきます。

jq コマンドとは

その名の通り、コマンドです。扱うデータがjson データになります。awk みたいな感じで、json 形式になっているデータを抜き出したり、整形したりすることができます。これが説明になります。けれども、見たほうが早いと思いますので、例を示してきます。

jq コマンドを使ってみよう

今回使うデータ

ごく一般的なデータになります。こういうデータがあるかはさておき、こういうデータがあると仮定します。ops はoperators です。test.json というファイル名です。

{
    "users": {
        "name": "John",
        "age": 30,
        "email": "john@example.com"
    },
    "city": "osaka",
    "ops": [
        {
            "name": "John",
            "age": 30,
            "email": "john@example.com"
        },
        {
            "name": "Jane",
            "age": 25,
            "email": "jane@example.com"
        },
        {
            "name": "Jay",
            "age": 60,
            "email": "jay@example.com"
        },
        {
            "name": "taro",
            "age": 40,
            "email": "taro@example.com"
        }
    ]
}

全データ取得

まずは全部のデータを取得します。

cat test.json | jq .

結果

{
  "users": {
    "name": "John",
    "age": 30,
    "email": "john@example.com"
  },
  "city": "osaka",
  "ops": [
    {
      "name": "John",
      "age": 30,
      "email": "john@example.com"
    },
    {
      "name": "Jane",
      "age": 25,
      "email": "jane@example.com"
    }
  ]
}

全部取れましたね。 jq の . は全体データのことを指します。なので、 .(ドット)を基準に色んな方向でデータを取得していきます。

users のみを取得する

users のみを取得する場合は、.の後ろにusers をつけることによって取得できます。基本的に. (ドット)の後ろに取得したい配列の名前を付ける形ですね。

cat test.json | jq ".users"

結果

{
  "name": "John",
  "age": 30,
  "email": "john@example.com"
}

では、users の中の name のみを取得したい場合はどうしたらいいでしょうか。

更に絞る

その前に要素、つまりkey value のvalue のみを取得する方法を先に紹介しないといけません

cat test.json | jq ".users[]" 

結果:

"John"
30
"john@example.com"

これで、value のみを取得できました。ということは、

# エラー
 cat test.json | jq ".users[name]"
=>jq: error (at <stdin>:19): Cannot index string with string "name"

# エラー
cat test.json | jq ".users[].name" 
jq: error (at <stdin>:19): Cannot index string with string "name"

この書き方はダメみたいですね。というのも[] を入れた時点で、value しか取得できてないので、それはだめですね。

cat test.json | jq ".users.name" 

結果:

"John"

users の中のname と明示的に指定する必要があるということですね。なんかPHP と似ていてわかりやすいですね。きっとプログラマーの人は直ぐにわかるのかな??なんか羨ましい。。。

クオーテーションを消して上げたいときは、

cat test.json | jq -r ".users.name" 

結果:

John

次に、複数ある配列はどのように取得したりするのかを書いていきます。

複数の配列

まずは、上のとおりにすると、

cat test.json | jq -r ".ops.name" 
jq: error (at <stdin>:19): Cannot index array with string "name"

エラーになります。それはそうですね。今回複数あります。なので、

cat test.json | jq -r ".ops[0].name"

cat test.json | jq -r ".ops[1].name"

という形で、何番目の配列を取得したいかを指定してあげる必要があります。そうすると、name のみが取得することができます。

具体的な条件で絞る

例えば、今回年齢によって、絞りたいとします。

cat test.json | jq -r ".ops[] | select(.age > 25) | .name"
John
Jay
taro

これが使えるということは、イコール関係であったり、null だったりと条件式で工夫できるということになりますね!

後は、length も取得できるらしいです。つまり配列が何個あるかみたいなやつです。

cat test.json | jq -r "[.ops[]] | length"

結果:

4

ops を更に[] で囲む必要があるのがポイントですね!

こんな感じでjq コマンドは色々応用することができます。

まとめ

今回はただのjqコマンドの紹介ですが、jq コマンドを使うとシェルスクリプトとかも更に幅が広がったりするので、結構おすすめのコマンドだったりします。jsonata とかもstep functions で使いやすくなったり??と思ったりもします。

参考サイト

jqコマンドでJSONを操作・分析する
jq
jq is a lightweight and flexible command-line JSON processor

\ 最新情報をチェック /

コメント

PAGE TOP
タイトルとURLをコピーしました