将输出重定向到一个文件,同时使用 grep 将输出过滤到另一个文件

将输出重定向到一个文件,同时使用 grep 将输出过滤到另一个文件

我正在运行一个进程,每秒输出一行数据。我想将所有输出输出到“output.txt”,但也将带有@的行输出到不同的文件“emails.txt”。我尝试了类似下面的方法,但是 grep 部分不起作用。

myProgrram | pee 'tee output.raw 2>&1' 'grep @ > email.txt'

关于如何改进这一点有什么想法吗?谢谢。

答案1

这是一种解决方案:

myprogram 2>&1 | tee output.txt | grep --line-buffered @ > emails.txt

解释:

  • stdin是“标准输入”(文件描述符编号0)。
  • stdout是“标准输出”(文件描述符编号1)。
  • stderr是“标准错误”(文件描述符编号2)。
  • 2>&1将发送到的任何内容重定向stderrstdout
  • |stdout左侧的管道连接到stdin右侧的管道。
  • tee output.txt同时做两件事:
    • 写信stdinoutput.txt
    • 传递stdinstdout.
  • |管道stdoutstdin.
  • grep --line-buffered @挑选出任何带有@from 的行stdin并将其发送到stdout
  • > emails.txtstdin将任何内容写入emails.txt.

--line-buffered标志grep在输出上使用行缓冲,这可能会导致性能损失,但可以确保全部输出将被打印到文件中。

答案2

感谢所有回复的人 - 以下代码有效

myProgram | pee 'tee -a output.txt' 'grep  --line-buffered @ > emails.txt'

相关内容