如何在Linux中将两个命名pipe道join单个inputstream

使用Linux中的pipe道( | )function,我可以将标准input转换为一个或多个输出stream。

我可以使用tee将输出拆分成单独的subprocess。

有没有一个命令来join两个inputstream?

我将如何去做这件事? 差异如何工作?

就我个人而言,我最喜欢的(需要在大多数Linux发行版上都是标准的bash和其他东西)

细节可以很大程度上取决于输出的两件事情以及如何合并它们…

command1和command2在输出之后的内容:

 cat <(command1) <(command2) > outputfile 

或者,如果两个命令都输出相同数据的替代版本,那么您可以并排查看(我使用过snmpwalk;一边是数字,另一边是MIB名称):

 paste <(command1) <(command2) > outputfile 

或者如果你想比较两个类似命令的输出(比如在两个不同的目录中查找)

 diff <(command1) <(command2) > outputfile 

或者,如果他们是某种sorting的输出,合并它们:

 sort -m <(command1) <(command2) > outputfile 

或者同时运行这两个命令(尽pipe如此,可能会混淆):

 cat <(command1 & command2) > outputfile 

<()运算符为每个命令设置一个命名pipe道(或/ dev / fd),将该命令的输出pipe道输送到命名pipe道(或/ dev / fd文件句柄引用)并在命令行上传递名称。 有一个相当于>()。 你可以这样做: command0 | tee >(command1) >(command2) >(command3) | command4 command0 | tee >(command1) >(command2) >(command3) | command4 command0 | tee >(command1) >(command2) >(command3) | command4同时将一个命令的输出发送给另外4个命令。

大猩猩显示,你可以用cat来追加两个蒸汽。

您还可以创build一个FIFO,将命令的输出指向该输出,然后使用任何其他程序从FIFO读取:

 mkfifo ~/my_fifo command1 > ~/my_fifo & command2 > ~/my_fifo & command3 < ~/my_fifo 

特别适用于只写或读文件的程序,或混合只输出标准输出/文件的程序和只支持另一个的程序。

 (tail -f /tmp/p1 & tail -f /tmp/p2 ) | cat > /tmp/output 

/tmp/p1/tmp/p2是您的inputpipe道,而/tmp/output是输出。

我为此创build了特殊的程序: fdlinecombine

它读取多个pipe道(通常是程序输出)并将其写入stdout(也可以覆盖分隔符)

我用过的一个非常酷的命令是tpipe ,你可能需要编译,因为它不常见。 它真的非常适合你在说什么,而且它很干净,我通常会安装它。 手册页位于http://linux.die.net/man/1/tpipe 。 目前列出的下载是在这个档案http://www.eurogaran.com/downloads/tpipe/

它是这样使用的,

 ## Reinject sub-pipeline stdout into standard output: $ pipeline1 | tpipe "pipeline2" | pipeline3 

在这里小心; 只是捕获它们最终会以你不想要的方式混合结果:例如,如果它们是日志文件,你可能不希望从另一个中间插入的行中插入一行。 如果没关系的话

tail -f / tmp / p1 / tmp / p2> / tmp / output

将工作。 如果这不行,那么你将不得不做一些行缓冲,只输出完整的行。 系统日志这样做,但我不知道还有什么可能。

编辑:优化非缓冲读书和命名pipe道:

考虑/ tmp / p1,/ tmp / p2,/ tmp / p3作为命名pipe道,由“mkfifo / tmp / p N

tail -q -f / tmp / p1 / tmp / p2 | awk'{print $ 0>“/ tmp / p3”; closures( “/ TMP / P3”); fflush();}'&

现在通过这种方式,我们可以读取输出命名pipe道“/ tmp / p3” unbuffered by:

尾-f / tmp / p3

有小错误的sorting,你需要“初始化”第一个inputpipe道/ tmp / p1通过:

echo -n> / tmp / p1

为了尾部先接受来自第二个pipe / tmp / p2的input,而不是等到/ tmp / p1。 这可能并非如此,如果您确定,/ tmp / p1将首先接收input。

此外,-q选项需要为了尾巴不打印关于文件名的垃圾。

最好的scheme是lmerge 。 与freihart的答案不同,它是面向行的,所以两个命令的输出不会互相打断。 与其他解决scheme不同,它可以合并input,因此没有命令可以支配输出。 例如:

 $ lmerge <(yes foo) <(yes bar) | head -n 4 

给出的输出:

 foo bar foo bar