这是@kojiro 对我之前的问题的评论的后续内容Bash 在管道时丢失字符串转义,推荐
jq --stream
。我的问题涉及到达 JSON 文件的Tetragon 事件 流。结构如下:
...
{
"process_exec": {
"process": {
"pid": ...,
"uid": ...,
"binary": "...",
...
},
"parent": {
...
}
},
"time": "..."
}
{
"process_exit": {
"process": {
...
},
"parent": {
...
}
},
"time": "..."
}
...
我想过滤流,以便仅保留“类型”
process_exit
的记录。我查阅了关于 Streaming 的 jq 手册部分和一篇文章 Streaming With JQ,但到目前为止没有任何结果。我还尝试了以下表达式和许多类似的变体:jq Streaming 确实不容易处理。那么我该如何解决我的具体问题呢?总之:在这种情况下我该如何使用jq --streaming
?
tail -f file | jq --stream \
'fromstream(0 | truncate_stream(select(.[0][0] == "process_exit")))
如果我理解正确,您的输入已经是一个对象流,您希望通过键的存在来过滤它。这可以简单地使用
select
和 has
来完成,如下所示:
jq 'select(has("process_exit"))'
如果这应该是另一个过滤器的延续(如您之前的问题所建议的),其本身以
select
结尾,只需使用逻辑连接词将两者组合起来:
… | jq '… | select(… and has("process_exit"))'
如果由于某种原因您需要使用
--stream
生成输入,请使用 inputs
和 -n
标志来捕获和处理分解的部分:
jq --stream -n 'fromstream(inputs) | select(has("process_exit"))'
在更深层次上捕获(如
truncate_stream
,然后select(.[0][0] …)
)没有意义(此处),因为
.process_exit
),但你实际上想要重现整个对象,如果它匹配(如果我理解正确的话) )truncate_stream
的原因),因为最终您仍然必须在内存中重建整个对象才能将其生成为输出(再次,如果我理解正确的话,整个对象就是您的预期输出)