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