gpt4 book ai didi

linux - 使用 linux bash 处理数据流

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:31:23 26 4
gpt4 key购买 nike

我正在处理来自 babeltrace 命令的实时流数据。该命令会不断输出日志。现在我想将这些日志分开并保存到不同的文件中。例如,0~10 秒之间的日志保存到文件 1,10~20 秒之间的日志保存到文件 2 ...请问在同时执行命令的时候用linux bash可以实现这个功能吗?

我试过:

    babeltrace --input-format=lttng-live Test | tee file1 file2 ... 

但是 tee 将重定向所有文件中的所有内容。

最佳答案

如果你想要任何健壮的东西,你真的需要编写一个程序来完成它。你可以尝试这样的事情:

babeltrace --input-format=lttng-live Test | { i=0; while : $((i++)); do 
timeout 10 sh -c "cat > file-$i"; done; }

但在生产环境中我不相信这一点。

== 编辑 ==您不应该在生产环境中信任它的原因。我不知道 timeoutcat 的实现细节,即使我很了解它们,我也不相信它们不会改变(随着时间或平台)。我怀疑 timeout 会发送一个信号来终止 shell。如果 cat 已经读取了一些数据但还没有写入,会发生什么情况? cat 会优雅地终止并刷新其所有缓冲区,还是会丢弃任何未写入的数据? timeout 是否发送 TERMINT 或(喘气)KILL?这种行为是规范的吗? cat 在收到信号时会正常终止是否已标准化?我不知道,只编写一个强大的程序来处理这些问题比尝试依赖 timeoutcat 更容易。

另一个想法(我仍然不相信这是稳健的):

{ while sleep 10; do echo SENTINEL; done & babeltrace ...; } |
awk '/^SENTINEL/{of="output-file" idx++; next} {print > of}' of=output-file0

这里的基本思想是让单个 awk 进程读取 babeltrace 的输出并每 10 秒向输出流写入一个指示器,这会导致 awk 更改输出文件。请注意,如果您的输出流包含匹配“^SENTINEL”的行,它将被丢弃。一种稍微更稳健的方法是(咳咳,在这里幽默一下)让 awk 注册一个信号处理程序来更改输出文件名并让计时器向它发送一个信号,但是 a)我不知道是否除了深奥的 awk 之外,您还可以注册信号处理程序,并且 b) 说真的,我说过这样会更健壮吗?!如果您希望进程运行很长时间,您可能还想在 awk 中关闭输出文件。

关于linux - 使用 linux bash 处理数据流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57995343/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com