Help us understand the problem. What is going on with this article?

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

More than 3 years have 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

crowdworks
21世紀の新しいワークスタイルを提供する日本最大級のクラウドソーシング「クラウドワークス」のエンジニアチームです!
https://crowdworks.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away