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


Answers:


56

听起来该tee命令将执行您想要的操作。

关键是要用

>( )

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

tee >(proc1) >(proc2) >(proc3) | proc4

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

ls -A | tee >(grep ^[.] > hidden-files) >(grep -v ^[.] > normal-files) | less

的结果ls -A将“传递”到两个greps中。该文件hidden-files将具有第一个输出的内容grepnormal-files并将具有第二个的结果grep所有文件将显示在寻呼机中less 编辑:你看到的less完全相同的输出ls -A,而不是结果grep秒。如果你想修改从输出ls -Aless(例如交换等都正常文件是隐藏的问题之前列出的顺序),那么试试这个:

ls -A | tee >(grep ^[.]) >(grep -v ^[.]) >/dev/null | less

如果不使用>/dev/null,则greps 的输出将附加到的输出上,ls -A而不是替换它。

资源


3
这个很好!
hayalci

3
+1是因为即使经过10年的Shell脚本编写,我也从未见过!
jtimberman

6

使用“ tee”。

例:

grep someSearchString someFile | tee /dev/tty | wc -l > grepresult

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.