Shell:如何将匹配的输入行“重新路由”到不同的文件描述符(STDOUT,STDERR)?

时间:2016-01-19 12:59:04

标签: shell pipe

我必须使用行为不正常的应用程序:在STDOUT上给出信息性消息,在STDOUT上给出错误消息,在STDERR上给出警告(是的,确实存在!)。

是否有一种更简单的方法可以“重新路由”从STDOUT到STDERR的特定匹配线(反之亦然),而不会像这样大量使用“tee”:

{ bad_application | tee /dev/fd/3 | grep ^Error: >&2 ;} 3>&1 | grep -v ^Error:

有任何想法可以提供更简单的解决方案,减少额外实用程序的使用,并且可以在没有重复的情况下完成(因为这会混淆行的顺序)吗?

谢谢,

Mazze

1 个答案:

答案 0 :(得分:1)

这会影响顺序,但它应该只是将错误行移动到标准输出。

bad_application | awk '/^Error:/ {print > "/dev/stderr"; next} 7'

(7只是获得awk默认{print}操作的真值y。)

如果警告线被标记为标记错误行的方式,您可以将所有内容扔到awk并避免(至少在某种程度上)输出顺序错位

bad_application 2>&1 | awk '/^(Error|Warning):/ {print > "/dev/stderr"; next} 7'