有没有办法将bash中的输出重定向到具有不同过滤器的不同位置?

Pal*_*han 5 bash io-redirection

如果我有一个进程,a.out我可以./a.out | grep foo看到由foo过滤的a.out的stdout.我也可以说./a.out 2>&1 | grep foo看到错误和错误都被foo过滤掉了.使用该tee命令,我可以将stdout发送到终端和可能的文件输出.但有没有办法分别过滤这些?如:

./a.out | tee grep foo file.txt
Run Code Online (Sandbox Code Playgroud)

但是这样的东西file.txt被过滤以匹配foo但不是我在屏幕上看到的......或者更好的是我在屏幕上看到的被baz过滤而不是foo?如果没有办法在bash中这样做我会写自己的"发球台",但我想有一些方法......

Gri*_*vit 3

非常简单,只需使用文件句柄的进程替换即可:

./a.out | tee >(grep foo > out.txt) | grep baz
Run Code Online (Sandbox Code Playgroud)

另请注意,tee可以接受任意数量的参数,因此您可以执行以下操作:

./a.out | tee >(grep foo > foo.txt) >(grep bar > bar.txt) [etc]
Run Code Online (Sandbox Code Playgroud)