我正在运行一个进程,每秒输出一行数据。我想将所有输出输出到“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.txtstdin到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)