Я пытаюсь фильтровать вывод одного файла журнала в отдельные файлы журнала на основе фильтра grep.
tail -f test.log | tee>(grep "Error"> error.log)>(grep "Warning" "> warning.log)
Таким образом, все записи "Ошибка" находятся в одном файле, а все записи "Предупреждение" находятся в отдельном файле.
Я знаю, что это работает в принципе, потому что, если я использую cat вместо tail, я получаю правильный вывод файла, но не могу отслеживать изменения в реальном времени (что мне нужно, потому что я наблюдаю журналы вывода из активно запущенных тестов)
Кроме того, если я удаляю переадресацию файлов «>» из команд grep, то она корректно выводит отдельные выходы grep на консоль; однако, я хочу записанный файл также.
Ответ:
При записи в файл выходные данные grep буферизировались. Использование egrep с опцией --line-buffer исправило поведение.
Новая команда выглядит так:
tail -f test.log | tee>(egrep --line-buffered "ERROR"> error.log)>(egrep --line-buffered "WARNING"> warning.log)