🗂

jqコマンドの基本的な利用パターン

2022/07/24に公開

jqコマンドとは

jqは、軽量で柔軟なコマンドラインJSONプロセッサです。
JSONデータの加工・整形等の機能があります。

jqコマンドの基本的な利用パータン

JSONデータのハイライト表示

echoコマンド等のJSON出力データはハイライト表示していません。
jq .にパイプしておくと、コンパクトなJSONデータを整形して表示できます。

ハイライト表示
# コンパクトなJSONデータを整形して表示できます。
$ echo '{"id":1,"name":"john","age": 18}' | jq .
{
  "id": 1,
  "name": "john",
  "age": 18
}

配列から特定のデータの抽出

配列から特定の条件に当てはまるデータを抽出する時、この機能は

あるプロパティの値と一致の条件
cat << EOF | jq '.[] | select( .name | contains("linda"))'
[
    {"id": 1,"name": "john","age": 18},
    {"id": 2,"name": "linda","age": 28},
    {"id": 3,"name": "porter","age": 38}
]
EOF
数字プロパティの比較
cat << EOF | jq '.[] | select( .age < 30)'
[
    {"id": 1,"name": "john","age": 18},
    {"id": 2,"name": "linda","age": 28},
    {"id": 3,"name": "porter","age": 38}
]
EOF

配列要素の増減

配置に要素の追加

echo '["aaa","bbb","ccc"]' | jq '. + ["ddd","eee"]'

配置に要素の削除

オブジェクトのプロパティと値が全一致の場合のみ、JSONオブジェクトを削除します。

echo '["aaa","bbb","ccc"]' | jq '. - ["bbb","eee"]'

マルチJSONファイルのマージ

テストデータ
hoge.json
{
    "hoge1": {
        "aaa": {
            "user": "user_aaa",
            "password": "pass_hoge1aaa"
        }
    },
    "hoge2": {
        "bbb": {
            "user": "user_bbb",
            "password": "pass_hoge2bbb"
        }
    }
}
fuga.json
{
    "fuga1": {
        "aaa": {
            "user": "user_aaa",
            "password": "pass_fuga1aaa"
        }
    },
    "fuga2": {
        "bbb": {
            "user": "user_bbb",
            "password": "pass_fuga2bbb"
        }
    }
}

hoge.jsonとfuga.jsonのJSONデータをマージします。重複データがある場合、あとの方で勝ちます。

マルチJSONファイルのマージ
$ jq -s add hoge.json fuga.json
{
  "hoge1": {
    "aaa": {
      "user": "user_aaa",
      "password": "pass_hoge1aaa"
    }
  },
  "hoge2": {
    "bbb": {
      "user": "user_bbb",
      "password": "pass_hoge2bbb"
    }
  },
  "fuga1": {
    "aaa": {
      "user": "user_aaa",
      "password": "pass_fuga1aaa"
    }
  },
  "fuga2": {
    "bbb": {
      "user": "user_bbb",
      "password": "pass_fuga2bbb"
    }
  }
}

プロパティの値変更

  1. プロパティの値更新

    echo '{"id":1,"name":"john","age": 18}' | jq '.age = .age + 1'
    
  2. プロパティの追加

    echo '{"id":1,"name":"john","age": 18}' | jq '.added = "I am added by jq"'
    
  3. プロパティの削除

    echo '{"id":1,"name":"john","age": 18}' | jq '. | del(.age)'
    

おまけ

jqplayのサイトでリアルタイムでJQコマンドを検証できます。

https://jqplay.org/s/KsJNDSeALRk

参照

  1. jq
  2. 複数のjsonファイルをjqを使ってmergeする

Discussion