почему стандартный вывод egrep не прошел через трубу? - PullRequest
2 голосов
/ 08 апреля 2010

У меня странная проблема с egrep и pipe

Я попытался отфильтровать поток, содержащий несколько строк, начинающихся с названия темы, например "TICK: это тиковое сообщение \ n"

Когда я пытаюсь использовать egrep для фильтрации: ./stream_generator | egrep 'TICK' | ./topic_processor Кажется, что topic_processor никогда не получает никаких сообщений

Однако, когда я использую следующий скрипт на Python: ./stream_generator | python filter.py --topics TICK | ./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()

1 Ответ

2 голосов
/ 08 апреля 2010

Вы позволили команде ./stream_generator | egrep 'TICK' | ./topic_processor выполнить до конца?Если команда завершилась без выдачи выходных данных, то проблема не связана с буферизацией, поскольку после завершения ./stream_generator egrep сбросит любой из ее буферов и, в свою очередь, завершится.1007 * Теперь верно, что egrep будет использовать интенсивную буферизацию, когда не выводится напрямую на терминал (т.е. при выводе в канал или файл), и на некоторое время может появиться , egrepне выводит, если в буфере egrep накоплено недостаточно данных для подтверждения сброса.Это поведение можно изменить в GNU egrep, используя параметр --line-buffered:

./stream_generator | egrep --line-buffered 'TICK' | ./topic_processor 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...