将管道合并(多路复用)为一个(逐行)。有这样的程序吗?

将管道合并(多路复用)为一个(逐行)。有这样的程序吗?

是否已经有一个程序可以读取多个管道或文件描述符并写入标准输出(不分割行)。

类似cat,但同时读取所有文件并保留行。

就像是:

until(all fds are EOF) {
    select(multiple fds);
    read a line from triggered fd;
    write the line to the stdout;
}

需要避免编写 select/epoll 循环或在简单程序中使用多线程。例如“select loop for bash”。

更新:我也创建unix.SE 上有类似的问题。

答案1

部分解决方案可能是使用:

tail -fq file1 file2 file3 | grep -v ^$ | yourprogram

我将其称为部分解决方案,因为它会删除每次更改文件时添加的grep空行。如果您的输入包含空行,则会将其删除。tail

答案2

创建了一个程序来执行此操作:fdlinecombine。它读取指定的文件描述符并逐行输出数据。

检查了一些极端情况,进行了一些测试。希望它对某些人也有用。

答案3

使用 xargs(1) 和 tail(1) 的替代方法:

创建数据源:

$>touch datafile.txt
$>mkfifo pipe1
$>mkfifo pipe2

使用 xargs 启动 tail 进程:

$>echo datafile.txt pipe1 pipe2 | xargs -n 1 -P 0 tail -f >> datasink.txt

将数据推送至来源:

$>echo dataset1 > pipe1
$>echo dataset2 > datafile.txt
$>echo dataset3 > pipe1
$>echo dataset4 > pipe2

显示接收器的数据:

$>cat datasink.txt 
dataset1
dataset2
dataset3
dataset4

相关内容