为什么egrep的stdout没有经过管道?

时间:2010-04-08 07:12:27

标签: python shell pipe grep

我有一个关于egrep和管道的奇怪问题

我尝试过滤包含一些以主题名称开头的行的流,例如 “TICK:这是一个勾选消息\ n”

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

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

我想对于egrep也需要一个'flush'机制,这是正确的吗?

这里有人能给我一些线索吗?万分感谢

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()

1 个答案:

答案 0 :(得分:2)

您是否允许命令./stream_generator | egrep 'TICK' | ./topic_processor运行完成?如果命令已经完成而没有产生输出,则问题不在于缓冲,因为在./stream_generator终止时,egrep将刷新缓冲区中的任何一个,然后终止

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

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