我有一个关于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()
答案 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