たとえば本番のログから特定のキーだけデータを変えて(マスクして)保存したいみたいなとき
普通にやれば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さくっと扱いたいときに覚えておくといいと思います
記法が独特なので覚えづらい部分はありますがチートシートでも作っておけば便利に使いこなせるかなと思います