2

Я пытаюсь получить работающую систему для мониторинга специальных журналов. Я обычно просто хочу очень специфический паттерн, который я извлекаю, используя grep и трубу из tail -f . Я заметил, что grep выводит не все, а сохраняет некоторые строки в буфере. Я думаю, это имеет смысл, если у вас есть канал, который будет выводить все, а затем завершать и закрывать поток.
Но с tail -f это не работает для меня.

Та же проблема появляется с sed .

Вот пример команды, которую я хочу использовать:

clear && tail -F -n1000 /var/log/fail2ban.log | grep 'WARNING.*Ban' | sed s/'fail2ban.actions: WARNING '//g | grep -E --color 'ssh-iptables-perma|$'

Чтобы привести пример:

Последняя строка приведенной выше команды такова:

2015-05-04 11:17:24,551 [ssh-iptables] Ban x.x.x.x

И с помощью этой команды:

clear && tail -F -n1000 /var/log/fail2ban.log | grep 'WARNING.*Ban' | sed s/'fail2ban.actions: WARNING '//g

Последняя строка это:

2015-05-04 19:45:17,615 [ssh-iptables] Ban y.y.y.y

Удаление дальнейших трубок приводит меня к самым последним записям.

Как я могу избежать этого кеширования в каналах?

2 ответа2

6

Добавьте параметр grep --line-buffered и параметр sed --unbuffered .

2

Используйте опцию grep --line-buffered .

По умолчанию утилиты используют линейную буферизацию, если их стандартный вывод является терминалом, но используют большие буферы (вероятно, 4 или 8 кБ), когда их вывод связан с файловым дескриптором или каналом.

Вам повезло, что tail -F по умолчанию использует буферизацию строки, а grep имеет параметр командной строки, чтобы включить это. Я не знаю универсального метода для включения буферизации строки для произвольной команды.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .