Проблема с буферизацией при передаче данных между программами CLI - PullRequest
1 голос
/ 31 марта 2011

Я пытаюсь подключить журналы ошибок apache через несколько фильтров.

Это прекрасно работает:

tail -fn0 /var/log/apache2/error.log | egrep -v "PHP Notice|File does not exist"

, но в выводе есть несколько букв "\ n", которые яхочу заменить на новую строку, поэтому я перенаправляю в perl:

tail -fn0 /var/log/apache2/error.log | egrep -v "PHP Notice|File does not exist" | perl -ne 's/\\n/\n/g; print"$_"'

Кажется, что есть некоторые проблемы с кэшированием (попадание первой страницы ничего не дает, попадание второй страницы и две загрузки отладочной информации выходят),Это также кажется немного временным.

Итак, я попробовал sed:

tail -fn0 /var/log/apache2/error.log | egrep -v "PHP Notice|File does not exist" | sed 's/\\n/\n/g'

, который, похоже, испытывает ту же проблему.

Ответы [ 2 ]

4 голосов
/ 31 марта 2011

Правильно, когда вы используете большинство программ для файла или конвейера, они буферизируют вывод. Вы можете контролировать это в некоторых случаях: семейство GNU grep принимает опцию --line-buffered, специально для использования в подобных конвейерах. Также в Perl вы можете использовать $| = 1; для того же эффекта. (sed не имеет такой опции, о которой я знаю.)

Это материал в начале или в середине конвейера, который будет буферизироваться, а не конец (который говорит с вашим терминалом, поэтому он будет буферизован строкой), поэтому вы хотите использовать egrep --line-buffered.

1 голос
/ 13 октября 2011

Похоже, вы можете использовать -u для sed, как в:

tail -f myLog | sed -u "s/\(joelog\)/^[[46;1m\1^[[0m/g" | sed -u 's/\\n/\n/g'

, который закрывает журнал, выделяет 'joelog', а затем добавляет разрывы строк там, где есть '\ n'

Источник: http://www -01.ibm.com / поддержка / docview.wss? UID = isg1IZ42070

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...