当我在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输出到终端时,不需要开始行。但如果你继续用管道连接另一个程序,你就会想要它。