我必须使用行为不正常的应用程序:在STDOUT上给出信息性消息,在STDOUT上给出错误消息,在STDERR上给出警告(是的,确实存在!)。
是否有一种更简单的方法可以“重新路由”从STDOUT到STDERR的特定匹配线(反之亦然),而不会像这样大量使用“tee”:
{ bad_application | tee /dev/fd/3 | grep ^Error: >&2 ;} 3>&1 | grep -v ^Error:
有任何想法可以提供更简单的解决方案,减少额外实用程序的使用,并且可以在没有重复的情况下完成(因为这会混淆行的顺序)吗?
谢谢,
Mazze
答案 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'