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

lor*_*o-s 26 grep pipe tee stdout

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

$ myscript
Line A
Line B
Line C

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

$ cat out.file
Line A
Line C
Run Code Online (Sandbox Code Playgroud)

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

gol*_*cks 39

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

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

myscript | tee /dev/stderr | grep -P 'A|C' > out.file
Run Code Online (Sandbox Code Playgroud)

将在 linux 上工作;我不知道“/dev/stderr”是否同样适用于其他 *nix。

  • `/dev/stderr` 很常见。`/dev/tty`(表示当前终端)也可以在这里工作,它是[标准](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap10.html)。 (12认同)

Sté*_*las 10

{ ... | tee /dev/fd/3 | grep -e A -e C > out.file; } 3>&1
Run Code Online (Sandbox Code Playgroud)

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

... | tee >(grep -e A -e C > out.file)
Run Code Online (Sandbox Code Playgroud)

使用 zsh:

... >&1 > >(grep -e A -e C > out.file)
Run Code Online (Sandbox Code Playgroud)


don*_*sti 5

这是另一种方式sed

myscript | sed '/PATTERN/w out.file'
Run Code Online (Sandbox Code Playgroud)

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