使用 jq --stream 的重要示例

问题描述 投票:0回答:1

这是@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")))
streaming jq
1个回答
0
投票

如果我理解正确,您的输入已经是一个对象流,您希望通过键的存在来过滤它。这可以简单地使用

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
    的原因),因为最终您仍然必须在内存中重建整个对象才能将其生成为输出(再次,如果我理解正确的话,整个对象就是您的预期输出)
© www.soinside.com 2019 - 2024. All rights reserved.