動的に複数のファイルをgrepして出力をカスタマイズする

動的に複数のファイルをgrepして出力をカスタマイズする

2つの異なるログファイルを監視したい(イベントがログに表示されるとき)。

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

各ファイルについていくつかのパターンを把握したいと思います。

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}

これにより、必要なすべてのログの目的の出力が生成されるため、パラメータを使用して複数の-eスキーマgrepを生成できます。それからすべて一緒に:

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

関連情報