使用jq处理JSON日志时如何跳过损坏行不中断后续处理
jq处理含损坏行的JSON日志跳过错误的解决方案
核心解决命令
直接使用jq内置的错误捕获语法搭配-R参数即可实现需求:
< snippet2.json jq -C -R 'try fromjson catch empty | .message' -r
输出结果完全符合预期:
sent send binary to ws server1 sent send binary to ws server2 sent send binary to ws server4 sent send binary to ws server5
命令解释
-R参数的作用是将每一行输入作为原始字符串读入,不会提前做JSON解析,避免jq直接遇到损坏行就终止- 你之前使用
-R报错的原因是没有先将读入的字符串转为JSON对象,直接对字符串类型取.message字段自然会抛出类型错误 try fromjson catch empty逻辑:尝试将读入的字符串转为JSON对象,解析失败则返回empty(即丢弃当前行),不会抛出中断级错误- 后续正常写你需要的字段提取逻辑即可,只会作用在解析成功的JSON对象上
可选扩展:统计损坏行
如果需要感知有多少行损坏,可以调整catch逻辑将错误信息输出到标准错误,不影响正常结果输出:
< snippet2.json jq -C -R 'try fromjson catch (debug | empty) | .message' -r
错误行会在stderr输出提示,stdout还是正常的提取结果。
内容的提问来源于stack exchange,提问作者Wu Shanhe
相关产品推荐
相关产品推荐

