使用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