jqを覚えるうえで知ってたら得なこと


作成日:2025-10-21 23:43:51
更新日:2025-10-23 09:15:35

自分がjqを覚えようとしたとき、初めから知っていたら楽かもしれないと思ったことを書きます

まず初めに知っておく必要があることとして、jqは入力と出力、そして処理中にjsonのストリーム(複数のjsonオブジェクトの集まり)を処理します

なので、例えば以下のコマンドは正しく動き、出力として 2 3 4 を出します

echo '1 2 3' | jq '. + 1'

これは、入力として数値のストリームを受け取り、ストリームの各値 . に対して1を加算して、それをストリームで返すことで実現されています

また、jqは配列を [] によってストリームに変換することができます
なので、以下のコマンドは 1 2 3 4 を返します

echo '[{"a":[1,2]},{"a":[3,4]}]' | jq '.[].a[]'

これは、入力配列 . をストリームに変換し、その各値に対してフィールドを抽出し、さらに各フィールドの配列をストリームに変換し、それらがまとめられて出力となっています
値がどのように変換されているかは、概念的には以下のようになります

[{"a":[1,2]},{"a":[3,4]}] -> {"a":[1,2]} {"a":[3,4]}
{"a":[1,2]} {"a":[3,4]} -> [1,2] [3,4]
[1,2] [3,4] -> 1 2 3 4

また、このストリームを変換するものはフィルタと呼ばれ、jqはこのフィルタを組み合わせて一つの入力ストリームを出力ストリームに変換します

たとえば . は入力をそのまま返すフィルタで、.name はオブジェクトの name フィールドを抽出するフィルタ、.[] は配列をストリームに変換するフィルタです

jqではこのフィルタを | でつなげて一つのフィルタを作り出すことができます
だいたいシェルのパイプと同じで、例えば先程のコマンドは以下のように書き直せます

echo '[{"a":[1,2]},{"a":[3,4]}]' | jq '.[] | .a | .[]'

パイプを使わなかった場合のように、一部のフィルタはパイプ無しで繋げられます

とりあえずこれを覚えて、あとは man jq とかを眺めていたら使えるようになると思います

それではまた