Хвост несколько файлов при передаче одного из файлов через grep

2582
Brian

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

tail -f file1 file2|grep mySearch 

Проблема заключается в том, что оба файла запускаются через grep или, скорее, вывод tail проходит через grep. Только file2 должен быть отфильтрован с помощью grep mySearch. Есть идеи?

Я пробовал именованные каналы, подстановки процессов и составные команды.

4

3 ответа на вопрос

2
John T

Здесь есть несколько способов снять шкуру с кошки. Мой личный фаворит на все времена - MultiTail . Он предоставляет множество способов настройки и отображения вывода из файлов, а также ряд способов фильтрации этого вывода с помощью регулярных выражений. Например, вы можете отфильтровать 1 файл, оставив еще 4 без изменений. Вы можете сделать обратный фильтр, как и grep -v.

Страницу с примерами команд можно найти по адресу http://www.vanheusden.com/multitail/examples.html.

Вам также могут понравиться некоторые скриншоты в действии. Несколько окон контролируются ncurses.

Если вы такой тип программирования, как я, вы можете создать персонализированное решение с чем-то похожим на модуль Perl File :: Tail, используя selectотдельные дескрипторы.

1
bryan

Можете ли вы запустить два хвоста в фоновом режиме, передавая отфильтрованные и нефильтрованные выходные данные во временный файл.

Затем используйте этот временный файл в качестве источника для всего, что вам нужно -

tail -f file1 >> temp & tail -f file2 | grep mySearch >> temp &   do something with temp now 
Похоже, вторая строка в вашем решении (строка с grep) не работает. Если я подключаю только один файл и создаю grep-файл и отправляю его в файл в фоновом режиме, а затем подключаю временный файл, временный файл никогда не записывается. Какие-либо предложения. Brian 14 лет назад 0
Разобрался - пришлось добавить --line-buffered в мой оператор grep. Но теперь у меня другие проблемы - например, когда мое соединение закрывается, tail все еще работает на сервере, хотя я даю ssh опцию -t. Кроме того, похоже, что вывод из файла журнала greped вставляется дважды. Спасибо за помощь. Brian 14 лет назад 1
Не берите в голову то, что я сказал о процессах, висящих вокруг. Должно быть, от предыдущих испытаний. Brian 14 лет назад 0
Итак, каков статус сейчас? bryan 14 лет назад 0
Это команда, с которой я закончил: (tail -f ~ / file1 >> temp &); (tail -f file2 | grep - line-buffered mySearch >> temp &); tail -f temp Мне нужно было использовать --line-buffered, чтобы заставить его работать. Благодарю. Brian 14 лет назад 0
1
john

Многоэтажный звучит так же, как мне нужно.

Это то, что я делал, и это хорошо, за исключением того, что строки журнала не в точном временном порядке.

------------- 8 <-------------

#!/bin/bash  function pidof_prog_file() { PGM=$1 FIL=$2 lsof -n 2>/dev/null| grep "$.*$" | tr -s ' ' | cut -d' ' -f 2 }  T="tail -n 10 -f"  kill -TERM `pidof_prog_file tail application.log` $T /var/www/protected/runtime/application.log | tr '\t' ' ' | tr -s ' ' | sed "s|^|PHP:|" &  kill -TERM `pidof_prog_file tail access.log` $T /var/log/apache2/access.log | tr '\t' ' ' | tr -s ' ' | sed "s|^|HTTP:|" &  kill -TERM `pidof_prog_file tail catalina.out` $T /var/log/tomcat6/catalina.out | tr '\t' ' ' | tr -s ' ' | sed "s|^|JAVA:|" &  kill -TERM `pidof_prog_file ssh devj-db` sudo -u $ME ssh $dbhost "$T /var/log/mysql/query.log" | tr '\t' ' ' | tr -s ' ' | sed "s|^|SQL:|"