我使用jq来解析日志数据,有时日志包含格式错误的东西(无效的json),当发生这种情况时,jq会中止处理。
有没有办法让jq继续处理它可以,同时通过stderr报告问题?
据我所知,如果你的JSON中有换行符,如果它从下一行开始,jq可能有问题,但在这种情况下,你最终仍然会找到合法的json消息的开头并且可以继续处理。
答案 0 :(得分:5)
使用jq-1.5,我能够做到以下几点:
# Include All Errors in output as a string
cat example.log | jq -R '. as $raw | try fromjson catch $raw'
# Skip all errors and keep going
cat example.log | jq -R 'fromjson?'
不是json的行将作为字符串输出,其他所有行都将是json
答案 1 :(得分:4)
如果您有jq 1.5,答案是:是,但一般来说,预处理(例如使用hjson或any-json)会更好。
无论如何,这个想法只是利用try / catch功能。以下是使用inputs
过滤器的插图。请注意,通常应使用-n选项调用jq,以使其正常工作。
def handle: inputs | [., "length is \(length)"] ;
def process: try handle catch ("Failed", process) ;
process
[1,2,3]
{id=546456, userId=345345}
[4,5,6]
$ jq -n -f recover.jq bad.json
[
"[1,2,3]",
"length is 3"
]
"Failed"
[
"[4,5,6]",
"length is 3"
]