メモ置き場

jq filterメモ

Basic filters

  • Identity: .
    • 入力をそのまま出力する
  • Object Identifier-Index: .foo
    • objectを入力とし、キーfooの値を返す
    • .foo?のように?を後置した場合は、入力として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"