使用Linux bash处理数据流

时间:2019-09-18 14:37:05

标签: linux bash stdout

我正在处理来自babeltrace命令的实时流数据。该命令将连续输出日志。现在,我想将这些日志分开并保存到其他文件中。例如,将0〜10秒之间的日志保存到file1,将10〜20秒之间的日志保存到file2 ... 同时执行命令时,是否可以使用Linux bash实现此功能?

我尝试过:

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

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

1 个答案:

答案 0 :(得分:1)

如果您想要强大的功能,则确实需要编写一个程序来执行。您可以尝试以下方法:

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

但是我不相信在生产环境中。

==编辑== 您不应该在生产环境中信任此原因。我不知道timeoutcat的实现细节,即使我很了解它们,我也不相信它们不会随着时间或平台的变化而改变。我怀疑timeout会发送信号终止外壳。如果cat读了一些数据但还没有写数据会怎样? cat是否会正常终止并刷新其所有缓冲区,还是将丢弃任何未写入的数据? timeout是否发送TERMINT或(gasp)发送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中关闭输出文件。