たとえば本番のログから特定のキーだけデータを変えて(マスクして)保存したいみたいなとき
普通にやればsedやawkで頑張ってできそうですがjqであればサクッとできてしまいます
今回下記のサンプルjsonを用意しました
- sample.json
{ "hoge": "fuga", "foo": "bar", "baz": [ 1,2,3 ] }
|=
演算子で特定のキーの値を書き換えて出力できます
$ cat hoge.json| jq '.foo|="replaced"' { "hoge": "fuga", "foo": "replaced", "baz": [ 1, 2, 3 ] }
上だけだと特定のキーが無かった場合追加されてしまうのでなければそのまま、あれば上書きしたくなることが多いかと思います
連続したデータの中で値がある場合のみ処理したい場合はifで囲えばOKです
# 対象キーにデータが存在しないので何も変更しない $ cat sample.json| jq 'if(has(".piyo")) then .piyo|="replaced" else . end' { "hoge": "fuga", "foo": "bar", "baz": [ 1, 2, 3 ] } # 対象キーにデータが存在するので変更して出力 $ cat sample.json| jq 'if(has(".foo")) then .foo|="replaced" else . end' { "hoge": "fuga", "foo": "replaced", "baz": [ 1, 2, 3 ] }
jqはなにかと便利なのでコマンドラインでjsonさくっと扱いたいときに覚えておくといいと思います
記法が独特なので覚えづらい部分はありますがチートシートでも作っておけば便利に使いこなせるかなと思います