Posted at

jqでJSONパースできない行のエラーを無視する

More than 1 year has passed since last update.

JSON形式のログとかいい感じにパースして加工するのにjq便利なんだけど、たまに入力データがおかしくて、JSONパースできない行が混じってるとこんなかんじでエラーが出て途中で止まる。

例えばこんなかんじで途中にerrorとか謎の行が入ってるファイルをjqに流し込むと、

$ cat test.log

{"aaa": 111, "bbb": 112}
{"aaa": 211, "bbb": 212}
error
{"aaa": 311, "bbb": 212}

こんなかんじでエラーで止まる。

$ cat test.log | jq -r '.aaa'

111
211
parse error: Invalid numeric literal at line 4, column 0

エラーで止めたい場合もあるけど、単にJSONパースできない場合は無視してほしいときもある。

そういう場合は、どうすればよいか調べたところ、

-R(--raw-input) で入力行をパースせずに読み込んで fromjson でJSONパースしつつ ? でパースできなかったら単に無視して、 | で後ろに流してやるとよいみたい。

$ cat test.log | jq -r -R 'fromjson? | .aaa'

111
211
311

参考: https://github.com/stedolan/jq/issues/884