【问题标题】:why egrep's stdout did not go through pipe?为什么 egrep 的标准输出没有通过管道?
【发布时间】:2011-02-05 14:09:18
【问题描述】:

我遇到了一个关于 egrep 和管道的奇怪问题

我尝试过滤包含一些以主题名称开头的行的流,例如 "TICK:这是一条滴答消息\n"

当我尝试使用 egrep 过滤它时: ./stream_generator | egrep 'TICK' | ./topic_processor topic_processor 似乎从来没有收到任何消息

但是,当我使用以下 python 脚本时: ./stream_generator | python filter.py --topics 勾选 | ./topic_processor 一切看起来都很好。

我想 egrep 也需要一个“刷新”机制,这是正确的吗?

这里有人可以给我一个线索吗?谢谢一百万

import sys
from optparse import OptionParser

if __name__ == '__main__':

    parser = OptionParser()

    parser.add_option("-m", "--topics",
                  action="store", type="string", dest="topics")

    (opts, args) = parser.parse_args()

    topics = opts.topics.split(':')

    while True:
        s = sys.stdin.readline()
        for each in topics:
            if s[0:4] == each:
                sys.stdout.write(s)
                sys.stdout.flush()

【问题讨论】:

  • 如果你只做./stream_generator | egrep 'TICK',你会得到什么?您是否在控制台上得到了预期的结果输出?

标签: python shell pipe grep


【解决方案1】:

您是否允许命令./stream_generator | egrep 'TICK' | ./topic_processor 运行完成?如果命令完成但没有产生输出,则问题不在于缓冲,因为在 ./stream_generator 终止时,egrep 将刷新任何 缓冲区并依次终止。

现在,egrep 在不直接输出到终端时(即输出到管道或文件时)确实会使用大量缓冲,并且可能会出现 一段时间 @如果在egrep 的缓冲区中积累的数据不足以保证刷新,则 987654325@ 不会产生输出。在 GNU egrep 中可以使用 --line-buffered 选项更改此行为:

./stream_generator | egrep --line-buffered 'TICK' | ./topic_processor 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-28
    • 2018-04-21
    • 1970-01-01
    • 2018-08-10
    • 2022-07-05
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多