jq

Page content

select 文で検索

select(boolean_expression) The function select(foo) produces its input unchanged if foo returns true for that input, and produces no output otherwise.

It´s useful for filtering lists: [1,2,3] | map(select(. >= 2)) will give you [2,3].

  • select 文で検索: and or

    $ cat hoge.json | jq '.[] | select(.Tags[].Key == "Name" and .Tags[].Value == "app.commonlisp")'
    
  • select 文の検索: startswith で先頭一致 (jq v1.5 以降で動いた. 1.3 とかはだめだった)

    $ cat wine.jl | jq '.[] | select(.name | startswith("Pinot"))'
    
  • select 文の検索: test で正規表現

    $ cat wine.jl | jq '.[] | select( .| test("Lisp"))'
    
  • 変数を利用

    $ jq -n --arg a 1 --arg b 2 --arg c 3 '{ a: $a, b: $b, c: $c }'
    $ echo '{"a":[1,2],"b":[3,4],"c":[5,6]}' | jq '.a as $a|.c as $c| .b | $c + . + $a'
    
  • ちょっと本気のやつ

    date; for i in `cat ipv6pref_edited.txt`; do \
    echo $i; \
    cat combined_20180201.json | jq --arg j $i '.[] | select(.constructionData[0].ipAddress | startswith($j)) | {"uuid": .uuid, "ipAddress": .constructionData[0].ipAddress }' >> uuids.txt; \
    done; date
    

sort

  • array に対する sort は sort_by

    $ cat file.json | jq '. | sort_by(.name)'
    
  • object 内をキーの名前順でソートするには -S オプション

    $ jq -S . file.json
    

2つのファイル に対する操作

  • 別の名前空間の2つのファイルを単純にmergeしたい場合は add を利用することでまとめることができます。

    $ jq -s add foo.json bar.json
    
  • 要素を追加するときは、掛け算のごとく * を利用するようです (競合がある場合、後勝ち)

    $ jq -s '.[0] * .[1]' foo.json bar.json