目次
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コマンドの基本的な使い方やオプションについて紹介しましたが、まだまだ使いこなせていない機能がたくさんあります。是非、実際に試してみて、自分なりの使い方を見つけてみてください。