在Linux上缓冲过滤管道

时间:2009-09-03 11:36:00

标签: linux unix pipe buffer pipes-filters

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

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

是否有标准命令可以执行此操作,还是需要编写Perl脚本?

提前感谢您的任何想法!

Wodow,爱好管道

3 个答案:

答案 0 :(得分:2)

您可以使用简单的awk / gawk 1衬垫来执行此操作:

编辑:更新以修复dmckee在其评论中指出(和修复)的错误

gawk'{sum = sum“\ n”$ 0}; / success / {print sum}'

答案 1 :(得分:1)

可能最简单的解决方案是使用sed

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

答案 2 :(得分:0)

快速而肮脏的方式就是这样:

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

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