使用 stdout 两次(但不是我所知道的 tee)

使用 stdout 两次(但不是我所知道的 tee)

我有一个相关问题 如何在两个方向上分叉标准输出 但有不同的转折。 (我已经知道 T 恤了!:)

我希望输出既按原样显示(tee 到控制台?)并通过管道进行进一步细化。

示例:我有

ps -ef | grep -i something

现在我希望双方都能看到这个结果并进一步完善它,例如

| awk '{print "epwdx "$2}'

当然,我可以按顺序运行这两个命令并捕获所有结果,但有时我想将它们作为一个单元运行,也许会增加它们说出一致的当前事实的可能性。

也许有一种方法可以使用其他技巧(例如 -、2>、&2 等),但我还没有看到。

答案1

如果您想将输出从管道中间拉到终端,您可以tee将其连接到/dev/tty(或/dev/stderr)。

这应该将输出打印something到终端,并将相同的输出定向somefilter到输出文件。

somecmd | tee /dev/tty | somefilter > output 

不过,如果您想稍后查看输出,将最终输出和中间输出都保存到文件中,然后查看它们可能会更容易。

不过,如果您只想过滤 所显示的进程集ps或其打印的字段,则该程序也有一些内置选项。请参阅手动的对于“进程选择”、“输出格式”和“格式说明符”。

答案2

你可以使用pee如果你有:

pee 类似于 T 恤,但用于管道。每个命令都会运行并提供标准输入的副本。所有命令的输出都发送到 stdout。请注意,虽然这与 tee 类似,但输入的副本不会像 tee 那样发送到 stdout。

看来您必须隐式指定一个将输入复制到 STDOUT 的命令:

ps -ef | pee "cat" "grep -i something"

答案3

您可以使用tee流程替换,例如

ps -ef | grep -i something | tee >(awk '{print "epwdx "$2}')

虽然我认为 @roaima 提供了一个很好的awk解决方案,这可能是最好的方法

答案4

据我所知,这不能仅使用文件描述符来完成,并且似乎建议的技巧tee >/dev/tty足以完成您的工作。

只是为了共享信息,我使用 bash 配置文件中的函数来完成这项工作,如下所示:

function teee { a="$(</dev/stdin)";echo -e "pipe in\n$a\npipe out\n" >/dev/stderr; echo "$a"; }

测试:

$ cat file11 |teee|grep -Po '[A-Za-z]+[\s|\w]+,\s[0-9]+' file11 | teee |awk '{print $2}'
pipe in
Ubuntu, 120, 143, 154
Yggdrasil, 144, 170-171
Yood, Charles, 6
We Were Young, Bob, 178-179
Zawinski, Jamie, 204
pipe out

pipe in
Ubuntu, 120
Yggdrasil, 144
Charles, 6
Bob, 178
Jamie, 204
pipe out

120
144
6
178
204

相关内容