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

Я хочу отслеживать 2 разных файла журнала (в то время, когда события появляются в журналах).

tail -f /var/log/file1 -f /var/log/file2  

Для каждого файла я хочу использовать несколько шаблонов grep:

tail -f /var/log/file1 | grep '\(pattern1\|pattern2\)'  
tail -f /var/log/file2 | grep '\(pattern3\|pattern4\|pattern5\)' 

Я не знаю, как Чтобы все это работало вместе. Кроме того, я хотел бы распечатать вывод журнала file1 красным цветом, а вывод журнала file2 синим:

Опять же, я могу сделать это для одного файла (фрагмент, который я взял на этом форуме):

RED='\033[0;31m'
BLUE='\033[0;34m'  

tail -fn0 /var/log/file1 | while read line;
    do
       if echo $line | grep -q '\(pattern1\|pattern2\)';then
          echo -e "{$RED}$line"
       fi
    done

Но Я совершенно не знаю, как это сделать для нескольких файлов. Есть идеи?

0
17.08.2017, 11:59
3 ответа

Если вы хотите анализировать несколько журналов одновременно, вы можете использовать следующий синтаксис:

tail -f /var/log/{log1,log2}

Это приведет к желаемому выводу всех необходимых журналов, поэтому вы можете использовать аргумент -eв grepдля создания нескольких шаблонов. Так что все вместе:

tail -f /var/log/{log1,log2} | grep -ie "pattern1" -ie "pattern2" -ie "pattern3"

Что касается окрашивания grep, взгляните на этот отличный ответ.

0
28.01.2020, 04:41
 tail -n 0 -f file1 file2 |
   awk -v file1pattern="pattern1|pattern2" -v file2pattern="pattern3|pattern4" \
  '/^==> file1 <==$/ { print "\033[0;31m"; pattern=file1pattern };
   /^==> file2 <==$/ { print "\033[0;34m"; pattern=file2pattern }; $0 ~ pattern'
0
28.01.2020, 04:41

Теги

Похожие вопросы