最近までまったく知らなかったのですがここまでできるのか!という感じだったので残しておく
?オペレータ
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
以外にも式は色々あるので覚えておくとサクサクかけて楽できるかと思います