хвост несколько файлов и grep вывод

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

  • tail: предупреждение: бесконечное следование стандартному вводу неэффективно
tail -f  | grep --line-buffered "Search this: " /var/links/proc2/id/myprocess*/Daily/myprocess*.log

Может ли кто-нибудь помочь разобраться с этим?


person 212    schedule 30.09.2013    source источник
comment
Дубликат superuser.com/questions /59471/   -  person Evan Carroll    schedule 20.12.2014


Ответы (3)


Вам следует взглянуть на инструмент multitail (установите с помощью sudo apt-get install multitail)

Короче говоря, с 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 
person Anshul Goyal    schedule 30.09.2013
comment
Какую версию мультитейла вы используете? Я не могу найти вывод multitail с версией, упакованной с Debian: multitail 5.2.13 - person Thor; 30.09.2013
comment
@Thor Исправил мой ответ. - person Anshul Goyal; 30.09.2013
comment
@mu無 Когда вы закончите, как вы избавитесь от панели под своим терминалом? Я сделал Ctrl + C, и он вышел из мультитейла, но эта полоса все еще там. Даже выход с сервера не помог. Мне пришлось полностью закрыть свой терминал. Раздражающий!!! - person IRGeekSauce; 11.09.2019
comment
@IRGeekSauce Сейчас у меня нет доступа к Linux-машине, поэтому я не могу проверить. Вы можете попробовать задать новый вопрос на сайте, чтобы получить помощь от сообщества :) - person Anshul Goyal; 11.09.2019
comment
@mu無 Я понял это. Просто введите ясно. - person IRGeekSauce; 11.09.2019

ошибка в том, что вы отдаете файлы команде 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: '
person Udy    schedule 30.09.2013
comment
Спасибо. Это работает частично, но я не получаю имена файлов, в которых найден шаблон? - person 212; 30.09.2013
comment
решение: for f in path/to/files*.txt; do echo $f; tail $f | grep 'SEARCH-THIS'; done; - person cgnorthcutt; 14.02.2021

Это интересный вопрос, и простой ответ должен быть таким: Используйте переключатель префикса с хвостом, но, к сожалению, в настоящее время это не реализовано в большинстве версий tail.

Как я вижу, у вас есть два варианта: адаптировать стандартные инструменты к задаче (см. Udys ответ) или напишите свой собственный инструмент на своем любимом языке сценариев/программирования.

Ниже приведен один из способов сделать это с помощью модуля File::Tail::Multi для perl. Обратите внимание, что вам может понадобиться установить модуль из CPAN (cpan -i File::Tail::Multi).

Сохраните следующий скрипт, например. mtail на путь к исполняемому файлу и сделайте скрипт исполняемым.

#!/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: "
person Thor    schedule 30.09.2013
comment
1) Чем это отличается от использования multitail? 2) Будет ли он выводиться по именам файлов, как спрашивает OP в комментариях к ответу @Udys › - person Anshul Goyal; 30.09.2013
comment
@ansh0l: 1) multitail выводит свои результаты в curses, что невозможно собрать. 2) Да, каждая строка имеет префикс исходного имени файла. - person Thor; 30.09.2013
comment
Ну хорошо, +1 за проклятия. Но с многосторонним флагом -E вам не нужно будет выполнять сам grep. - person Anshul Goyal; 30.09.2013