いくつかのプロセスによって絶えず更新されている複数のログファイルからパターンをgrepし、このgrepの出力を継続的に調整したいと思います。以下のコマンドは機能せず、
- テール:警告:標準入力に無期限に従うことは効果がありません
tail -f | grep --line-buffered "Search this: " /var/links/proc2/id/myprocess*/Daily/myprocess*.log
誰かがこれを整理するのを手伝ってもらえますか?
multitail
ツール(Sudo apt-get install multitail
を使用してインストール)を確認する必要があります
つまり、マルチテールでは、すべての出力を1か所で表示するために--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 -E "Search this: " /var/links/proc2/id/myprocess*/Daily/myprocess*.log
間違いは、ファイルをテールではなくgrepコマンドに渡すことです。
tail -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: '
これは興味深い質問であり、簡単な答えは次のようになります。プレフィックススイッチをtailとともに使用しますが、残念ながら、これは現在、tail
のほとんどのバージョンで実装されていません。
私が見ているように、2つのオプションがあります:標準ツールをタスクに適合させる( Udys回答 を参照)またはお気に入りのスクリプト/プログラミング言語を使用した独自のツール。
以下は、Perl
のFile::Tail::Multi
モジュールを使用して実行できる1つの方法です。 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: "
grep
が最後のコマンドである場合、--line-buffered
を指定する必要はないため、これで十分です。
mtail /var/links/proc2/id/myprocess*/Daily/myprocess*.log | grep "Search this: "