输出到stdout并同时grep到文件中


18

我有一个将文本输出到的脚本stdout。我想在终端中看到所有这些输出,同时我想过滤一些行并将其保存在文件中。例:

$ myscript
Line A
Line B
Line C

$ myscript | grep -P 'A|C' > out.file

$ cat out.file
Line A
Line C

我想在终端中查看第一个命令的输出,并将第二个命令的输出保存在文件中。同时。我尝试使用tee,但没有结果,或者更好,结果相反

Answers:


27

我想在终端中查看第一个命令的输出,并将第二个命令的输出保存在文件中。

只要您不在乎所查看的内容是来自stdout还是stderr,您仍然可以使用tee

myscript | tee /dev/stderr | grep -P 'A|C' > out.file

将在Linux上运行;我不知道“ / dev / stderr”是否同样适用于其他* nixes。


9
/dev/stderr常见。/dev/tty(表示当前终端)也可以在这里使用,并且它是standard
吉尔斯(Gilles)'所以

@吉尔斯:太好了。tee /dev/tty对于我必须将stdout脚本的打印到终端并将其通过管道传输到stdin另一个命令的需求而言,它的服务非常出色!谢谢!:-)
jamadagni14年

8
{ ... | tee /dev/fd/3 | grep -e A -e C > out.file; } 3>&1

或使用进程替换(ksh93,zsh或bash):

... | tee >(grep -e A -e C > out.file)

使用zsh:

... >&1 > >(grep -e A -e C > out.file)

我发现我必须使用第一个,因为它保留了grep的退出代码。另外,如果由于某种原因您无法访问/ dev文件系统,则/dev/fd/3可以将其替换为>(cat 1>&3)
golvok

4

这是另一种方式sed

myscript | sed '/PATTERN/w out.file'

默认情况下,sed打印每行,因此在这种情况下stdout将与stdin相同(即,您将myscript在屏幕上看到的全部输出)。
此外,所有匹配的行都PATTERN将被w写入out.file


-1

您没有指定如何使用tee命令,但这应该可以工作:

myscript | grep -P 'A|C' | tee out.file

至少几分钟前它在我的服务器上工作了...


4
但是,如果我没有错,这样你用grep也什么是在屏幕上。我想在屏幕上看到所有输出,并仅过滤文件中的内容。
lorenzo-s
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.