一个命令的输出可以通过管道传输到另外两个命令吗?

Ric*_*ins 33 unix bash

如何将一个命令的输出同时通过管道传输到其他两个命令的输入?

小智 69

听起来tee命令会做你想做的事。

关键是用

>( )
Run Code Online (Sandbox Code Playgroud)

用于进程替换。使用tee,使用以下模式:

tee >(proc1) >(proc2) >(proc3) | proc4
Run Code Online (Sandbox Code Playgroud)

因此,如果您想将 的输出ls用作两个不同grep程序的输入,请将每个程序的输出保存grep到不同的文件,并将所有结果通过 管道传输less,请尝试:

ls -A | tee >(grep ^[.] > hidden-files) >(grep -v ^[.] > normal-files) | less
Run Code Online (Sandbox Code Playgroud)

的结果ls -A将被“输送”到两个greps 中。该文件hidden-files将包含第一个输出的内容grepnormal-files并将包含第二个输出的结果grep所有文件都将显示在寻呼机中less 编辑:你看到的less完全相同的输出ls -A,而不是结果grep秒。如果您想将输出修改ls -Aless, (例如交换顺序,以便在隐藏文件之前列出正常文件),请尝试以下操作:

ls -A | tee >(grep ^[.]) >(grep -v ^[.]) >/dev/null | less
Run Code Online (Sandbox Code Playgroud)

如果没有>/dev/nullgreps的输出将附加到 的输出ls -A而不是替换它。

来源

  • +1 因为即使经过 10 年的 shell 脚本编写,我也从未见过这个! (4认同)
  • 这个非常好! (3认同)

Pet*_*sen 6

使用“三通”。

例子:

grep someSearchString someFile | tee /dev/tty | wc -l > grepresult
Run Code Online (Sandbox Code Playgroud)

这会将 grep 命令的输出发送到终端和wc(其输出又被重定向到文件 grepresult)。

“Tee”在维基百科文章tee (command) 中有解释。核心是:“tee 命令读取标准输入,然后将其内容写入标准输出并同时将其复制到指定的文件或变量中。”。