grep 动态多个文件并自定义输出

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

但我绝对不知道如何对多个文件执行此操作。有任何想法吗?

答案1

如果要同时解析多个日志,可以使用以下语法:

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

这将产生所有必需日志的所需输出,因此您可以使用参数-eingrep来创建多个模式。所以大家在一起:

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

关于 grep 的着色,请看一下很好的答案。

答案2

 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'

答案3

这是解决方案(谢谢基特先生和鸭子)。

如何仅使用 Awk 尾随 -f 颜色输出并显示输出的其余部分?

相关内容