jq コマンドについて

4 min 286 views

jq コマンドとは

jq コマンドは JSON 形式のデータを処理するツールです。JSON データをスライスしたり、フィルターしたり、マップしたりしてデータ構造を変形させることができます。

JSON 形式のデータ入力に jq コマンドフィルタを適用し、その結果を標準出力に生成します。

jq コマンド使用時に意識するべきこと

JSON データの構造は、大きく分けて オブジェクト {}配列 [] の2種類があります。jq コマンドで JSON データを加工処理する場合は、この2種類を意識してデータ加工をする必要があります。

ファイルから JSON データを読み込む

jqコマンドは、標準入力からJSON形式のデータを読み込むことができますが、ファイルから読み込むこともできます。以下は、ファイルからJSON形式のデータを読み込む例です。

$ jq '.name' example.json
"Alice"

上記の例では、example.jsonというファイルからJSON形式のデータを読み込み、 .name というフィルターを使って name プロパティを抜き出しています。

jq コマンドのオブジェクト識別子について

jqコマンドにおけるオブジェクト識別子は、JSONオブジェクトのキーを指定するために使用されます。以下によく使われるオブジェクト識別子をいくつか紹介します。

.識別子

.識別子は、JSONオブジェクトのプロパティにアクセスするために使用されます。例えば、以下のようなJSONオブジェクトが example.json ファイルとしてあるとします。

{
  "name": "Alice",
  "age": 20,
  "address": {
    "city": "Tokyo",
    "street": "1-1-1"
  }
}

このオブジェクトの nameプロパティにアクセスする場合、以下のように . 識別子を使います。

$ jq '.name' example.json
"Alice"

同様に address プロパティの city プロパティにアクセスする場合は、以下のようになります。

$ jq '.address.city' example.json
"Tokyo"

[]識別子

[] 識別子は、JSONオブジェクトの配列の要素にアクセスするために使用されます。例えば、以下のようなJSONオブジェクトが example.json ファイルとしてあるとします。

{
  "fruits": [
    { "name": "apple", "color": "red" },
    { "name": "banana", "color": "yellow" },
    { "name": "grape", "color": "purple" }
  ]
}

このオブジェクトの fruits 配列の2番目の要素、つまり{ "name": "banana", "color": "yellow" }にアクセスする場合、以下のように [] 識別子を使います。

$ jq '.fruits[1]' example.json
{
  "name": "banana",
  "color": "yellow"
}

.識別子 =

.識別子を使ってプロパティにアクセスするだけでなく、=演算子を使ってプロパティの値を変更することもできます。例えば、以下のようなJSONオブジェクトがあるとします。

{
  "name": "Alice",
  "age": 20
}

このオブジェクトの age プロパティを 21 に変更する場合、以下のようになります。

$ jq '.age = 21' example.json
{
  "name": "Alice",
  "age": 21
}

[]識別子 |= 式

[]識別子と|=演算子を組み合わせると、JSONオブジェクトの配列の要素を変換することができます。具体的には、[]識別子で配列の各要素にアクセスし、|=演算子を使って式を適用することで、各要素を変換することができます。

例えば、以下のようなJSONオブジェクトが example.json ファイルとしてあるとします。

{
  "fruits": [
    { "name": "apple", "color": "red" },
    { "name": "banana", "color": "yellow" },
    { "name": "grape", "color": "purple" }
  ]
}

このオブジェクトのfruits配列の各要素のcolorプロパティの値を大文字に変換する場合、以下のように[]識別子と|=演算子を使います。

$ jq '.fruits[].color |= ascii_upcase' example.json

ascii_upcaseは文字列を大文字に変換する関数です。このコマンドを実行すると、example.jsonファイルの内容が以下のように変更されます。

{
  "fruits": [
    {
      "name": "apple",
      "color": "RED"
    },
    {
      "name": "banana",
      "color": "YELLOW"
    },
    {
      "name": "grape",
      "color": "PURPLE"
    }
  ]
}

jq コマンドオプションについて

-c (compact) オプション

デフォルトの整形表示ではなく、改行や空白を詰めて出力結果をコンパクトにします。

$ echo '{"item1": 0, "item2": 1}' | jq . -c
{"item1":0,"item2":1}
$

-r(raw output)オプション

jq コマンドのフィルター結果が文字列の場合、クォート付きの JSON 文字列ではなく、文字列をそのまま標準出力に出力します。

まとめ

jqコマンドは、JSON形式のデータを扱うためのコマンドラインツールです。jqコマンドを使うと、JSON形式のデータを加工したり、フィルタリングしたり、変換したりすることができます。jqコマンドの基本的な使い方やオプションについて紹介しましたが、まだまだ使いこなせていない機能がたくさんあります。是非、実際に試してみて、自分なりの使い方を見つけてみてください。

カテゴリー:
関連記事