如何使用tee命令将所有输出发送到标准输出,并将grep过滤后的输出发送到文件?

6

我可以使用tee命令将输出同时发送到标准输出和文件,如下所示:

./process.sh | tee output.log

我该如何将完整的输出发送到标准输出,将grep筛选后的输出发送到文件中?

这个方法行不通,因为tee需要第二个文件参数:

./process.sh | tee | grep foo > output.log
2个回答

5
您可以尝试以下方法:
./process.sh | { tee /dev/tty | grep foo > output.log; }

这不会将输出发送到标准输出(stdout),而是发送到tty。也许这已经足够好了。

或者你可以这样做:

./process.sh | awk '/foo/{ print > "output.log"} 1'

这个命令会将process.sh的所有输出都打印到终端上,同时将匹配foo的行写入文件中。

此外,你还可以这样做:

mkfifo fifo
./process.sh | { cat fifo & tee fifo | grep foo > output.log; }
rm fifo

可以通过/proc文件系统更加清晰地完成此操作:

./process.sh | { tee /proc/self/fd/6 | grep foo > output.lot; } 6>&1

3

除了将输出重定向到/dev/tty之外,如果您使用支持bash风格进程替换的shell(和操作系统),您可以这样做:

./process.sh | tee >(grep foo > output.log)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接