我正在使用jq来解析我的一些日志,但是由于各种原因,有些日志行无法解析。有没有办法让jq忽略这些行呢?我似乎找不到解决办法。我尝试使用一些人推荐的--seq参数,但是--seq忽略了我文件中的所有行。
vc9ivgsu1#
假设每个日志条目正好是一行,您可以使用-R或--raw-input选项告诉jq不要解析这些行,然后您可以将fromjson? |添加到过滤器中,使jq尝试将每一行解析为JSON,并丢弃出错的行。
-R
--raw-input
fromjson? |
ulydmbyx2#
我有日志流,其中一些消息是json格式的。我想通过jq管道json消息,并只是回显其余的。json消息位于单行上。
**解决方案:**使用grep和tee将行拆分为两个流,那些以“^{”开头的流通过jq,其余的只回显到终端。
cat logs | tee >(grep -v "^{") | grep "^{" | jq .或cat logs | tee >(grep -v "^{") | grep "^{" | jq .个
cat logs | tee >(grep -v "^{") | grep "^{" | jq .
**说明:**tee生成第二个流,grep -v打印非json信息,第二个grep只将看起来像json左括号的内容传输到jq。
fnx2tebb3#
这是一个老的线程,但这里有另一个完全在jq中的解决方案。这允许你处理正确的json行,也可以打印出非json行。
jq
jq -R . as $line | try (fromjson | <further processing for proper json lines>) catch $line'
egmofgnx4#
有几个关于FAQ page的问答讨论了“无效JSON”的主题,但请特别参阅Q:有没有办法让jq在遇到输入文件中的错误后继续运行?特别是,这里展示了如何使用--seq。然而,从您给出的稀疏细节(例如recommends)来看,似乎简单地使用inputs可能会更好。
inputs
def handle: inputs | [., "length is \(length)"] ; def process: try handle catch ("Failed", process) ; process
在调用jq时,不要忘记使用-n选项。另请参见处理不完全有效的JSON。
5f0d552i5#
如果JSON在大括号{}中:grep -Pzo '\[(?>[^\[\]]|(?R))*\]' | jq 'arrays'如果JSON在方括号[]中:grep -Pzo '\[(?>[^\[\]]|(?R))*\]' | jq 'arrays'个如果非JSON行中没有[]{},则此操作有效。
grep -Pzo '\[(?>[^\[\]]|(?R))*\]' | jq 'arrays'
5条答案
按热度按时间vc9ivgsu1#
假设每个日志条目正好是一行,您可以使用
-R
或--raw-input
选项告诉jq不要解析这些行,然后您可以将fromjson? |
添加到过滤器中,使jq尝试将每一行解析为JSON,并丢弃出错的行。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。
fnx2tebb3#
这是一个老的线程,但这里有另一个完全在
jq
中的解决方案。这允许你处理正确的json行,也可以打印出非json行。egmofgnx4#
有几个关于FAQ page的问答讨论了“无效JSON”的主题,但请特别参阅Q:
有没有办法让jq在遇到输入文件中的错误后继续运行?
特别是,这里展示了如何使用--seq。
然而,从您给出的稀疏细节(例如recommends)来看,似乎简单地使用
inputs
可能会更好。在调用jq时,不要忘记使用-n选项。
另请参见处理不完全有效的JSON。
5f0d552i5#
如果JSON在大括号{}中:
grep -Pzo '\[(?>[^\[\]]|(?R))*\]' | jq 'arrays'
如果JSON在方括号[]中:
grep -Pzo '\[(?>[^\[\]]|(?R))*\]' | jq 'arrays'
个如果非JSON行中没有[]{},则此操作有效。