Linux 上的缓冲过滤管道

发布于 2024-08-03 16:43:11 字数 284 浏览 5 评论 0原文

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

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

是否有一个标准命令可以做到这一点,或者我需要编写一个 Perl 脚本吗?

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

Wodow,管道爱好者

I commonly build up long, multi-command pipes on Linux/Unix to process large text files (sed | grep | sort | less , etc.).

I would like to be able to use a pipeline element that would buffer everything received via stdin until a key phrase/string is detected (e.g. "SUCCESS"), at which point it releases everything received up to that point to stdout and then continues to pass the rest of the stream through. If the key phrase is not detected, the program would discard all the contents.

Is there a standard command that can do this, or do I need to write a Perl script?

Thanks in advance for any ideas here!

Wodow, lover of pipes

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

深者入戏 2024-08-10 16:43:11

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

中指出(并修复)的错误

编辑:更新以修复 dmckee 在其评论gawk '{sum = sum "\n" $0} ; /成功/ {打印总和}'

You could use a simple awk/gawk 1 liner to do this:

EDIT: Updated to fix the bug that dmckee pointed out (and fixed) in his comment

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

君勿笑 2024-08-10 16:43:11

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

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

Probably the simplest solution is to use sed:

    sed '/SUCCESS/,$!{H;d;};$H;x'
哑剧 2024-08-10 16:43:11

一种快速而肮脏的方法是这样的:

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

但如果你经常这样做,它就值得有一个自己的脚本。

A quick and dirty way of doing it goes like this:

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

But if you do this often, it deserves a script of its own.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文