我正在运行一个进程,每秒输出一行数据。我想将所有输出输出到“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
将发送到的任何内容重定向stderr
到stdout
。|
stdout
左侧的管道连接到stdin
右侧的管道。tee output.txt
同时做两件事:- 写信
stdin
给output.txt
- 传递
stdin
到stdout
.
- 写信
|
管道stdout
到stdin
.grep --line-buffered @
挑选出任何带有@
from 的行stdin
并将其发送到stdout
。> emails.txt
stdin
将任何内容写入emails.txt
.
该--line-buffered
标志grep
在输出上使用行缓冲,这可能会导致性能损失,但可以确保全部输出将被打印到文件中。
答案2
感谢所有回复的人 - 以下代码有效
myProgram | pee 'tee -a output.txt' 'grep --line-buffered @ > emails.txt'
- 我还希望程序打印到控制台,“tee”会执行此操作,并附加 output.txt
- 使用无缓冲:将命令的输出通过管道传送到 grep,然后传送到另一个命令