notebook

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

jqでエラーを無視する

最近までまったく知らなかったのですがここまでできるのか!という感じだったので残しておく

?オペレータ

tryのショートハンド、式の実行を行いエラーの場合は無視してくれる

テキストファイルからjsonの値だけ扱う

-Rオプションでrawテキストから読み込むことでjsonに変換できるものだけ扱うみたいなことができる

  • sample.txt
"hoge"
{"a": "b"}
"faga"
{"c": "d"}
"piyo"
$ cat sample.txt | jq -R 'fromjson?'
{
  "aa": "bbb"
}
{
  "cc": "ddd"
}

jsonのデータがあるものだけ扱う

たとえば下記の様なログファイルの場合

paramsがエスケープされたjsonなので単純にfromjsonを実行すると""の部分でエラーになってしまう

ifなど分岐を使って回避する事もできるが記述が長くなってしまうので?でよしなにやることができる

  • log.json
[
  {"hoge": 1, "params": ""},
  {"hoge": 2, "params": "{\"a\": \"b\"}"},
  {"hoge": "fuga", "params": ""},
  {"hoge": 3, "params": "{\"c\": \"d\"}"},
  {"hoge": "piyo", "params": ""}
]
$ cat log.json | jq '.[]|.params|fromjson?'
{
  "a": "b"
}
{
  "c": "d"
}

覚えておくだけでスッキリ書くことができそう

以前jqで特定の行がパースできずに落ちてしまいその先の処理ができずということがあり、結局jq使うのやめたパターンがあったのでそういうときに使えそうだと思いました

fromjson以外にも式は色々あるので覚えておくとサクサクかけて楽できるかと思います