自分が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 とかを眺めていたら使えるようになると思います
それではまた