如何将命令的输出传送到另一个命令同时将其显示在控制台上?

如何将命令的输出传送到另一个命令同时将其显示在控制台上?

我想将流的部分结果写入文件,但我希望将流的全部内容打印到控制台。是否有命令可以帮助实现这一点?

最小示例:

假设我有一个文件,foo.txt其内容为:

bat
dude
rude

我想将该文件中包含字母“a”的所有行写入bar.txt。我可以写

cat foo.txt | grep 'a' > bar.txt

这将导致bar.txt包含bat。但这不会给我想要的控制台输出。

相反,我更喜欢这样:

cat foo.txt | output-stdin-to-console-and-pass-to-stdout | grep 'a' > bar.txt

它不仅会写入batbar.txt还会将以下内容写入控制台:

bat
dude
rude

有什么命令我可以运行来做到这一点?

答案1

明确示例tee

  • tee写入 tty

    < foo.txt tee /dev/tty | grep 'a' > bar.txt
    

    这是便携式的,可以在 中使用sh

  • tee写入进程替换,其标准输出到控制台:

    < foo.txt tee >(grep 'a' > bar.txt)
    

    这是不可移植,可在 Bash 和其他一些 shell 中运行。

注意我删除了cat命令(无用地使用cat)。

答案2

你可以简单地使用这个:

cat foo.txt && cat foo.txt | grep 'a' > bar.txt

否则,可以使用tee

https://www.geeksforgeeks.org/tee-command-linux-example/

tee 命令读取标准输入并将其写入标准输出和一个或多个文件。该命令以管道工程中使用的 T 型分离器命名。它基本上会拆分程序的输出,以便既可以显示又可以保存在文件中。它同时执行这两项任务,将结果复制到指定的文件或变量中,并显示结果。

相关内容