このログファイルを使用すると、データが継続的に入力されます。私が望むのは、このログファイルを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
する。retail
tailは正規表現を含むツールで、ここであなたのユースケースのために書いたツールです。あなたの場合は、以下を使用してください。
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