我有一个相关问题 如何在两个方向上分叉标准输出 但有不同的转折。 (我已经知道 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