notebook

都内でWEB系エンジニアやってます。

jqで特定の値を書き換える

たとえば本番のログから特定のキーだけデータを変えて(マスクして)保存したいみたいなとき

普通にやれば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さくっと扱いたいときに覚えておくといいと思います

記法が独特なので覚えづらい部分はありますがチートシートでも作っておけば便利に使いこなせるかなと思います