我正在运行一个进程,每秒输出一行数据。我想将所有输出输出到“output.txt”,但也将带有@的行输出到不同的文件“emails.txt”。我尝试了类似下面的方法,但是 grep 部分不起作用。
myProgrram | pee 'tee output.raw 2>&1' 'grep @ > email.txt'
Run Code Online (Sandbox Code Playgroud)
关于如何改进这一点有什么想法吗?谢谢。
Ale*_*der 15
这是一种解决方案:
myprogram 2>&1 | tee output.txt | grep --line-buffered @ > emails.txt
Run Code Online (Sandbox Code Playgroud)
解释:
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
在输出上使用行缓冲,这可能会导致性能损失,但可确保所有输出都将打印到文件中。
感谢所有回复的人 - 以下代码有效
myProgram | pee 'tee -a output.txt' 'grep --line-buffered @ > emails.txt'
Run Code Online (Sandbox Code Playgroud)