Хвост нескольких файлов и grep вывод
Я хотел бы получить шаблон из нескольких файлов журналов, которые постоянно обновляются некоторыми процессами, и постоянно выводить результаты этого grep. Ниже команда не работает, и я получаю
- tail: warning: следующий стандартный ввод бесконечно неэффективен
tail -f | grep --line-buffered "Search this: " /var/links/proc2/id/myprocess*/Daily/myprocess*.log
Может кто-нибудь помочь разобраться?
Ответы
Ответ 1
Вы должны посмотреть multitail
tool (Установить с помощью sudo apt-get install multitail
)
Короче говоря, с многопользовательской версией, вам нужно использовать флаг --mergeall
для просмотра вывода всех в одном месте
multitail --mergeall /var/links/proc2/id/myprocess*/Daily/myprocess*.log | grep --line-buffered "Search this: "
Вы можете сделать то же самое без использования grep
multitail -E "Search this: " --mergeall /var/links/proc2/id/myprocess*/Daily/myprocess*.log
Для просмотра вывода по отдельности с использованием multitail это также даст имя файла.
multitail -E "Search this: " /var/links/proc2/id/myprocess*/Daily/myprocess*.log
Ответ 2
ошибка заключается в том, что вы передаете файлы команде grep, а не хвосту.
хвост -f должен получить файлы в качестве входных данных. попробуйте:
tail -f /var/links/proc2/id/myprocess*/Daily/myprocess*.log | grep --line-buffered "Search this: "
чтобы получить также имена файлов (однако это не будет похоже на выход grep):
tail /var/links/proc2/id/myprocess*/Daily/myprocess*.log | grep --line-buffered -e'^==> .* <==$' -e'Search this: '
Ответ 3
Это интересный вопрос, и простой ответ должен быть: использовать префиксный переключатель с хвостом, но, к сожалению, в настоящее время это не реализовано в большинстве версий tail
.
Как я вижу, у вас есть два варианта: адаптируйте стандартные инструменты к задаче (см. Ответ Udys) или напишите свой собственный инструмент с помощью ваших любимых скриптов/программирования язык.
Ниже вы можете сделать это с помощью модуля File::Tail::Multi
для perl
. Обратите внимание, что вам может потребоваться установить модуль из CPAN (cpan -i File::Tail::Multi
).
Сохраните следующий script, например. mtail
к вашему исполняемому пути и выполнить исполняемый файл script.
#!/usr/bin/env perl
use File::Tail::Multi;
$| = 1; # Enable autoflush
$tail = File::Tail::Multi->new(RemoveDuplicate => 0,
OutputPrefix => 'f',
Files => \@ARGV);
while(1) { $tail->read; $tail->print; sleep 2 }
Измените OutputPrefix
на 'p'
, если вы предпочитаете префикс полного пути.
Запустите его следующим образом:
mtail /var/links/proc2/id/myprocess*/Daily/myprocess*.log | grep --line-buffered "Search this: "
Вам не нужно указывать --line-buffered
, когда grep
является последней командой, поэтому этого достаточно:
mtail /var/links/proc2/id/myprocess*/Daily/myprocess*.log | grep "Search this: "