tail出力をファイルにリダイレクトし、一致するものが見つかったら停止します。

tail出力をファイルにリダイレクトし、一致するものが見つかったら停止します。

このログファイルを使用すると、データが継続的に入力されます。私が望むのは、このログファイルをtail -fとして処理し、ff条件を持つファイルにリダイレクトすることです。

ログファイルの内容の例

aaaaaaaaaaaaaaa
bbbbbbbbbbbbbbb
ccccccccccccccc
ddddddddddddddd
eeeeeeeeeeeeeee
fffffffffffffff
ggggggggggggggg
hhhhhhhhhhhhhhh
iiiiiiiiiiiiiii

テーリングでは、最初のパターンが見つかるとリダイレクトが開始され、2番目のパターンが見つかった場合はリダイレクトとテーリングが停止されます。例えば

「dddddddddddd」パターンが見つかるとリダイレクトが開始され、「hhhhhhhhhhhhhhhhh」パターンが見つかったらリダイレクトを停止したいと思います。リダイレクトによって生成されるファイルの内容は、次のようにする必要があります。

ddddddddddddddd
eeeeeeeeeeeeeee
fffffffffffffff
ggggggggggggggg
hhhhhhhhhhhhhhh

コーディングをしながらこのような考えをしました。しかし、2番目のパターンが見つかった場合は、リダイレクトを停止する方法がわかりません。

tail -f logfile > log.tmp
while grep "ddddddddddddddd" log.tmp
do
cat log.tmp > logfile
done

答え1

これが正しいretailする。retailtailは正規表現を含むツールで、ここであなたのユースケースのために書いたツールです。あなたの場合は、以下を使用してください。

retail -f -r ddddddddddddddd -u hhhhhhhhhhhhhhh logfile > log.tmp

-f標準tail -fオプションです。-r含める行の範囲を開始する正規表現と続行するには、正規-u表現を許可します。それは始まる最後パターンが表示され、-r印刷後に終了します。最初-uパターンはその後に現れた。

パターンの最初のインスタンスから始めるには、-bと一緒に使用できます-r。両方の正規表現はすべてむしろ、暗黙的なアンカリングはありませんが、通常どおり、一致をアンカーするために^使用できます。$


retail以下から入手してビルドできます。

git clone https://github.com/mwh/retail.git
cd retail
./configure
make
make install

~/.local/bin既定ではインストールされていますが、変更したり、目的の場所に実行可能ファイルをコピーしたりできます。


retail完全POSIX互換ただし、実際にシステムに使用することはお勧めできませんtail

答え2

お客様の要件を正しく理解すると、次のような結果が出ます。

awk '/ddddddddddddddd/,/hhhhhhhhhhhhhhh/ { print > "excerpt" } 1' infile | tail -f

awk「infile」ファイルのフィルタとして機能し、指定されたパターン間のすべての内容を「extract」ファイルに印刷し、各行を標準出力として印刷し、通常どおりに処理しますtail -f

ストリーミングデータで使用するには:

some_process | awk '/ddddddddddddddd/,/hhhhhhhhhhhhhhh/ { print > "excerpt" } 1'  | tail -f

(注:tail -fこれは対話型プログラムなので、可能であれば常にパイプラインに表示する必要があります。)

答え3

たぶんawkここでスコープモードを使うことができます。

tail -f logfile | awk '/ddddddddddddddd/,/hhhhhhhhhhhhhhh/'

この問題を回避する必要がある場合は、代わりにSIGPIPE次の方法を使用して操作をsocat実行できます。tail

socat -u file:logfile,ignoreeof "system:'stdbuf -o0 awk /ddddddddddddddd/,/hhhhhhhhhhhhhhh/'" > logfile.new

関連情報