jqコマンドの使い方


はじめに

jqコマンドの使い方についてのメモ。

環境

$ hostnamectl status
   Static hostname: ---
         Icon name: computer-vm
           Chassis: vm
        Machine ID: ---
           Boot ID: ---
    Virtualization: kvm
  Operating System: Ubuntu 20.04.2 LTS
            Kernel: Linux 5.4.0-72-generic
      Architecture: x86-64

./jq について

jqはコマンドラインでJSONを操作するためのコマンドで、執筆時に Ubuntu 20.04でインストールできる jqは下記バージョンだった。

$ jq --version
jq-1.6

jqコマンドがインストールされていない場合は、以下を実行。

$ sudo apt -y install jq

利用方法

1. 整形

以下のようなJSONがあった場合、正直見にくい。

{"records": [{"id": 1, "name":"一郎"},{"id": 2, "name":"二郎"},{"id": 3, "name":"三郎"},{"id": 4, "name":"四郎"},{"id": 5,"name":"五郎"}]}

そんな場合は、jqコマンドを利用することで改行されて見やすくすることができる。

$ echo '{"records": [{"id": 1, "name":"一郎"},{"id": 2, "name":"二郎"},{"id": 3, "name":"三郎"},{"id": 4, "name":"四郎"},{"id": 5,"name":"五郎"}]}' | jq .
{
  "records": [
    {
      "id": 1,
      "name": "一郎"
    },
    {
      "id": 2,
      "name": "二郎"
    },
    {
      "id": 3,
      "name": "三郎"
    },
    {
      "id": 4,
      "name": "四郎"
    },
    {
      "id": 5,
      "name": "五郎"
    }
  ]
}

2. 絞り込み

JSONから「records」の中身を抽出したい場合。

$ echo '{"records": [{"id": 1, "name":"一郎"},{"id": 2, "name":"二郎"},{"id": 3, "name":"三郎"},{"id": 4, "name":"四郎"},{"id": 5,"name":"五郎"}]}' | jq .records[]
{
  "id": 1,
  "name": "一郎"
}
{
  "id": 2,
  "name": "二郎"
}
{
  "id": 3,
  "name": "三郎"
}
{
  "id": 4,
  "name": "四郎"
}
{
  "id": 5,
  "name": "五郎"
}

JSONの配列から2つ目の要素を抽出したい場合。(要素は0が最初)

$ echo '{"records": [{"id": 1, "name":"一郎"},{"id": 2, "name":"二郎"},{"id": 3, "name":"三郎"},{"id": 4, "name":"四郎"},{"id": 5,"name":"五郎"}]}' | jq .records[1]
{
  "id": 2,
  "name": "二郎"
}

JSONの配列の要素から「name」だけ、全て抽出したい場合。

$ echo '{"records": [{"id": 1, "name":"一郎"},{"id": 2, "name":"二郎"},{"id": 3, "name":"三郎"},{"id": 4, "name":"四郎"},{"id": 5,"name":"五郎"}]}' | jq .records[].name
"一郎"
"二郎"
"三郎"
"四郎"
"五郎"

JSONの配列の要素から「id」が「3」以上のものだけ、全て抽出したい場合。

$ echo '{"records": [{"id": 1, "name":"一郎"},{"id": 2, "name":"二郎"},{"id": 3, "name":"三郎"},{"id": 4, "name":"四郎"},{"id": 5,"name":"五郎"}]}' | jq '.records | map(select( .["id"] > 3))'
[
  {
    "id": 4,
    "name": "四郎"
  },
  {
    "id": 5,
    "name": "五郎"
  }
]

JSONの配列の要素から「name」が「二郎」のものだけ、抽出したい場合。

$ echo '{"records": [{"id": 1, "name":"一郎"},{"id": 2, "name":"二郎"},{"id": 3, "name":"三郎"},{"id": 4, "name":"四郎"},{"id": 5,"name":"五郎"}]}' | jq '.records | map(select(.["name"] == "二郎"))'
[
  {
    "id": 2,
    "name": "二郎"
  }
]

3. 要素を数える

jqコマンドを使うことで、配列の要素数を簡単に数えることができる。

$ echo '{"records": [{"id": 1, "name":"一郎"},{"id": 2, "name":"二郎"},{"id": 3, "name":"三郎"},{"id": 4, "name":"四郎"},{"id": 5,"name":"五郎"}]}' | jq '.records | length'
5