如何复制流并以流方式处理两个部分?

Cer*_*era 4 shell streaming pipe tee

有时我想在管道中插入一些东西以用于报告或其他一些次要用途。它可能像 一样简单wc -l,或更复杂,awk比如甚至是 python 脚本。运行这样的管道会很好:

zcat my_data_file.gz \
| wc -l > /tmp/linecount
| process_data.py
Run Code Online (Sandbox Code Playgroud)

问题是大多数实用程序不会将数据正确输出到标准输出。tee可以将数据写入临时文件,但是我必须等到一切完成:

zcat my_data_file.gz \
| tee /tmp/f \
| process_data.py && \
wc -l /tmp/f > /tmp/linecount && rm /tmp/f
Run Code Online (Sandbox Code Playgroud)

这不是最佳的:它可能是一个运行时间非常长的管道;我可能希望更快地看到类似物的中间结果wc;我可能不想将所有数据存储在临时文件中。

Tho*_*hor 5

您可以使用tee并处理替换>(...)

zcat my_data_file.gz |

# Count number of lines in stream
tee >(wc -l > /tmp/linecount) |

# Further processing
process_data.py
Run Code Online (Sandbox Code Playgroud)

请注意,管道可用于行延续,并且注释可以散布在命令之间,这是构建复杂管道时的一个很好的功能。