当我在bash中运行below命令时,它会等待程序完成,然后刷新所有输出。如果我取下管道,它会立即打印每一行。

{ for i in `seq 3` ; do echo $i ; sleep 1 ; done ; } \
    | perl -p -e 's,(.*ERROR.*),\e[01;31m\1\e[00m,g' \
    | perl -p -e 's,(.*WARNING.*),\e[01;33m\1\e[00m,g' \
    | perl -p -e 's,(.*TCPEchoTest.*),\e[01;30m\1\e[00m,g' \
    | perl -p -e 's,(.*enters.*),\e[00;33m\1\e[00m,g'

我怎样才能使用这些管子,而且每一行都能立即打印出来?

最佳答案

您可以将几行perl代码与重复的-e选项连接起来(一定要以;结尾——它们串在一起形成一个程序)。你可以用$|=1使你的管道“热”起来。有关详细信息,请参见perl manual on $|(页面下方的2/3,搜索OUTPUT_AUTOFLUSH)。

{ for i in `seq 3` ; do echo $i ; sleep 1 ; done ; } \
  | perl -p -e 'BEGIN{$|=1};' \
            -e 's,(.*ERROR.*),\e[01;31m\1\e[00m,g;' \
            -e 's,(.*WARNING.*),\e[01;33m\1\e[00m,g;' \
            -e 's,(.*TCPEchoTest.*),\e[01;30m\1\e[00m,g;' \
            -e 's,(.*enters.*),\e[00;33m\1\e[00m,g;'

它打印1,2,3,每个数字之间有一秒。实际上,当perl输出到终端时,不需要开始行。但如果你继续用管道连接另一个程序,你就会想要它。

09-25 17:17