unix 忽略带有jq的无法解析的JSON

qoefvg9y  于 2022-11-04  发布在  Unix
关注(0)|答案(5)|浏览(161)

我正在使用jq来解析我的一些日志,但是由于各种原因,有些日志行无法解析。有没有办法让jq忽略这些行呢?我似乎找不到解决办法。我尝试使用一些人推荐的--seq参数,但是--seq忽略了我文件中的所有行。

vc9ivgsu

vc9ivgsu1#

假设每个日志条目正好是一行,您可以使用-R--raw-input选项告诉jq不要解析这些行,然后您可以将fromjson? |添加到过滤器中,使jq尝试将每一行解析为JSON,并丢弃出错的行。

ulydmbyx

ulydmbyx2#

我有日志流,其中一些消息是json格式的。我想通过jq管道json消息,并只是回显其余的。
json消息位于单行上。

**解决方案:**使用grep和tee将行拆分为两个流,那些以“^{”开头的流通过jq,其余的只回显到终端。

cat logs | tee >(grep -v "^{") | grep "^{" | jq .

cat logs | tee >(grep -v "^{") | grep "^{" | jq .

**说明:**tee生成第二个流,grep -v打印非json信息,第二个grep只将看起来像json左括号的内容传输到jq。

fnx2tebb

fnx2tebb3#

这是一个老的线程,但这里有另一个完全在jq中的解决方案。这允许你处理正确的json行,也可以打印出非json行。

jq -R . as $line | try (fromjson | <further processing for proper json lines>) catch $line'
egmofgnx

egmofgnx4#

有几个关于FAQ page的问答讨论了“无效JSON”的主题,但请特别参阅Q:
有没有办法让jq在遇到输入文件中的错误后继续运行?
特别是,这里展示了如何使用--seq。
然而,从您给出的稀疏细节(例如recommends)来看,似乎简单地使用inputs可能会更好。

def handle: inputs | [., "length is \(length)"] ;
def process: try handle catch ("Failed", process) ;
process

在调用jq时,不要忘记使用-n选项。
另请参见处理不完全有效的JSON。

5f0d552i

5f0d552i5#

如果JSON在大括号{}中:
grep -Pzo '\[(?>[^\[\]]|(?R))*\]' | jq 'arrays'
如果JSON在方括号[]中:
grep -Pzo '\[(?>[^\[\]]|(?R))*\]' | jq 'arrays'
如果非JSON行中没有[]{},则此操作有效。

相关问题