【问题标题】:Buffering filtering pipe on LinuxLinux 上的缓冲过滤管道
【发布时间】:2009-09-03 11:36:00
【问题描述】:

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

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

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

提前感谢这里的任何想法!

Wodow,烟斗爱好者

【问题讨论】:

  • 我对“管道爱好者”的赞美......

标签: linux unix pipe buffer pipes-filters


【解决方案1】:

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

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

gawk '{sum = sum "\n" $0} ; /success/ {打印总和}'

【讨论】:

  • 这不会通过“成功”之后的行。
  • 它可以很容易地进行修改。
  • 喜欢:gawk '/SUCCESS/{next} {sum = sum "\n" $0} END{print sum "\n"}' 假设 SUCCESS 键可以出现在一行中的任何位置。此外,还有一个错误修复(您需要 $0 而不是 $1)。
  • 回答者未能通过流的其余部分。 cmets 中的那个在文件末尾而不是在遇到 SUCCESS 时释放所有内容。
  • @JB:确实如此。 /SUCCESS/{found=1;next}...END{if (found) { print sum "\n"}} 或类似的。
【解决方案2】:

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

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

【讨论】:

  • 这可以在逐行的基础上完美运行(直接在命令行下测试)。
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-29
    • 2012-01-07
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    相关资源
    最近更新 更多