- jq 1.6 ManualのBasic filters, Types and Valuesを読んだメモ
Basic filters
- Identity:
.
- 入力をそのまま出力する
- Object Identifier-Index:
.foo
- objectを入力とし、キー
foo
の値を返す .foo?
のように?
を後置した場合は、入力としてobject以外を渡してもエラーとしない
- objectを入力とし、キー
- Generic Object Index:
.[<string>]
.["foo"]
は.foo
と同じ。- キー名に記号などが入っている場合、こちらを使用する必要あり
- Array Index:
.[<integer>]
- arrayを入力とし、指定されたインデックスの値を返す
- 負の値が指定された場合、終端からのインデックスになる
- Array/String Slice:
.[<start>:<end>]
- start(含む)からend(含まない)の部分配列・部分文字列を返す
# 例 $ echo '{"a":"string"}' | jq -c '.a | .[0:3]' "str"
- Array/Object Value Iterator:
.[]
- array/objectの各要素の値を別々の結果として返す
.[]?
の場合は入力がarray,object以外でもエラーとしない# 例 # ["v1", "v2"]ではなく、複数の結果として"v1"と"v2"を返している点に注意 $ echo '{"a":"v1", "b":"v2"}' | jq -c '.[]' "v1" "v2"
- Comma:
,
- 複数のフィルタを並列で指定する。
- 同じ入力が全てのフィルタに渡されて、全ての出力が連結されて返される
# 例 # `.a`の結果と`.b`の結果を連結。 # こちらも複数の結果として"v1"と"v2"を返す点に注意 % echo '{"a":"v1", "b":"v2"}' | jq -c '.a, .b' "v1" "v2" # Examplesにある例だが、`.["a","b"]`は`'.["a"], .["b"]'`と同値になっている? $ echo '{"a":"v1", "b":"v2"}' | jq -c '.["a","b"]' "v1" "v2"
- Pipe:
|
- 前のフィルタの出力を次のフィルタの入力に渡す
- Parenthesis:
()
- フィルタなどをグルーピングする
Types and Values
- Array construction:
[]
- 角かっこ内に指定されたフィルタの出力を配列として返す
# `.[]`を評価した複数の結果を配列に入れて返す $ echo '{"a":"v1", "b":"v2"}' | jq -c '[.[]]' ["v1","v2"]
- Object Construction:
{}
- key-valueを指定してオブジェクトを構築して返す
- 例:
{"foo": .bar}
- キー名が識別子のような場合は
""
を省略し{foo: .bar}
のようにできる - さらに
{foo: .foo}
のような場合は{foo}
とできる - valueに指定されたフィルタが複数の結果を生成する場合は、それぞれ別のオブジェクトを生成する
# `.[]`が複数の結果を返すため、複数のjsonが出力される $ echo '{"a":"v1", "b":"v2"}' | jq -c '{value:.[]}' {"value":"v1"} {"value":"v2"}
- Recursive Descent:
..
- 再起的にarrayやobjectをたどり、全ての部分木を出力する
$ echo '{"a":{"b":{"c":"d","e":"f"}}}' | jq -c '..' {"a":{"b":{"c":"d","e":"f"}}} {"b":{"c":"d","e":"f"}} {"c":"d","e":"f"} "d" "f"