2009-09-03 42 views
1

我通常在Linux/Unix上建立长长的多命令管道来处理大型文本文件(sed | grep | sort | less等)。在Linux上缓冲过滤管道

我希望能够使用管道元素来缓冲通过stdin接收的所有内容,直到检测到关键短语/字符串(例如“SUCCESS”),此时它将所有接收到该点的内容释放到标准输出然后继续传递其余的流。如果没有检测到关键短语,程序将丢弃所有内容。

有没有一个标准的命令可以做到这一点,还是我需要编写一个Perl脚本?

在此先感谢您的任何想法!

Wodow,管道的情人

+4

我对“管道爱好者”的恭维... – 2009-09-03 11:45:16

回答

1

也许最简单的解决方案是使用sed

 
    sed '/SUCCESS/,$!{H;d;};$H;x' 
+0

这可以在逐行的基础上完美工作(直接通过命令行进行测试)。 – wodow 2009-09-07 11:02:54

+0

感谢您的支持! – wodow 2009-09-07 11:03:28

2

你可以使用一个简单的awk /呆子1个衬垫做到这一点:

编辑:更新,以修复dmckee在他的评论

指出的(固定)的bug

gawk'{sum = sum'\ n“$ 0}; /成功/ {打印总和}”

+0

可爱。 – dmckee 2009-09-03 14:04:53

+0

这不会通过“成功”后面的行。 – mark4o 2009-09-03 18:36:38

+0

它可以很容易地被修改来做到这一点。 – Omnifarious 2009-09-03 23:06:37

0

做它的快速和肮脏的方式是这样的:

perl -pe'$b.=$_;/SUCCESS/&&last}print$b;while(<>){' 

但是,如果你经常这样做,它应该有一个自己的脚本。