如何在linux中将两个命名管道连接到单个输入流中

70 linux shell

使用|Linux 中的管道 ( ) 功能,我可以将标准输入转发链接到一个或多个输出流。

我可以使用tee将输出拆分为单独的子进程。

是否有连接两个输入流的命令?

我该怎么办?差异是如何工作的?

fre*_*eit 115

就我个人而言,我最喜欢的(需要 bash 和其他大多数 Linux 发行版的标准配置)

细节在很大程度上取决于这两件事的输出内容以及您希望如何合并它们......

输出中的 command1 和 command2 的内容在后面:

cat <(command1) <(command2) > outputfile
Run Code Online (Sandbox Code Playgroud)

或者,如果两个命令都输出您希望并排查看的相同数据的替代版本(我已将其与 snmpwalk 一起使用;一侧为数字,另一侧为 MIB 名称):

paste <(command1) <(command2) > outputfile
Run Code Online (Sandbox Code Playgroud)

或者,如果您想比较两个相似命令的输出(比如在两个不同目录上查找)

diff <(command1) <(command2) > outputfile
Run Code Online (Sandbox Code Playgroud)

或者,如果它们是某种排序的输出,请将它们合并:

sort -m <(command1) <(command2) > outputfile
Run Code Online (Sandbox Code Playgroud)

或者同时运行两个命令(虽然可能会有点混乱):

cat <(command1 & command2) > outputfile
Run Code Online (Sandbox Code Playgroud)

<() 运算符为每个命令设置一个命名管道(或 /dev/fd),将该命令的输出通过管道传输到命名管道(或 /dev/fd 文件句柄引用)中,并在命令行上传递名称。>() 有一个等价物。例如,您可以这样做:command0 | tee >(command1) >(command2) >(command3) | command4同时将一个命令的输出发送到其他 4 个命令。

  • 我能够通过通过 `grep --line-buffered` 管道来防止交错行 - 方便同时 `grep`'ing 多个日志文件的 `tail`。见 http://stackoverflow.com/questions/10443704/line-buffered-cat (3认同)
  • 您可以在 linux 文档项目的 [高级 bash 脚本指南] (http://tldp.org/LDP/abs/html/process-sub.html) 中找到参考 (2认同)

Chr*_*s S 17

您可以使用 将两个蒸汽附加到另一个蒸汽cat,如大猩猩所示。

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

mkfifo ~/my_fifo
command1 > ~/my_fifo &
command2 > ~/my_fifo &
command3 < ~/my_fifo
Run Code Online (Sandbox Code Playgroud)

对于仅写入或读取文件的程序,或将仅输出标准输出/文件的程序与仅支持另一个的程序混合使用特别有用。

  • 这个适用于 pfSense (FreeBSD),而接受的答案却没有。谢谢! (2认同)

小智 11

(tail -f /tmp/p1 & tail -f /tmp/p2 ) | cat > /tmp/output
Run Code Online (Sandbox Code Playgroud)

/tmp/p1/tmp/p2是你的输入管道,/tmp/output而是输出。

  • 注意:除非 `()` 中的两个命令都在每一行上刷新它们的输出(以及其他一些模糊的原子性 POSIX 规则),否则你最终可能会对 cat 的输入产生一些奇怪的扰乱... (6认同)

Vi.*_*Vi. 6

我为此创建了特殊程序:fdlinecombine

它读取多个管道(通常是程序输出)并将它们逐行写入标准输出(您也可以覆盖分隔符)