如何通过单独的grep过滤器发送stderr和stdout?

时间:2018-02-11 04:46:16

标签: bash shell grep

尝试运行生成大量stdout和stderr的命令。 需要一种方法来过滤大多数stderr消息。

这样的东西
command 1> grep "a" 2> grep "b"

替代如何只使用grep stderr而且还能看到stdout。

1 个答案:

答案 0 :(得分:-1)

执行:

{ command 2>&1 1>&3 3>&- | grep "b"; } 3>&1 1>&2 | grep "a"

注意:以上内容是从antak's answer to "pipe stdout and stderr to two different processes in shell script?"中窃取的,grep替换了更抽象的名称。有关它的工作原理,请参阅答案。 (尽管如此,需要grep的懒惰程序员可能更喜欢这样一个更具体的答案。)

用于区分 stdout stderr 的有用工具是annotate-output,(在 Debian 的“ devscripts < / em>“package”,它将 stderr stdin 发送到 stdout 以及有用的小前缀:

annotate-output wc -c /bin/bash /bin/nosuchshell

输出:

00:29:06 I: Started wc -c /bin/bash /bin/nosuchshell
00:29:06 E: wc: /bin/nosuchshell: No such file or directory
00:29:06 O: 1099016 /bin/bash
00:29:06 O: 1099016 total
00:29:06 I: Finished with exitcode 1

可以使用sedawk,甚至是tee和一些grep来分别解析该输出。