特定の文字列が見つかるまでログファイルを追跡して別のファイルに出力するシェルスクリプトはありますか?

特定の文字列が見つかるまでログファイルを追跡して別のファイルに出力するシェルスクリプトはありますか?

文字列が見つかるまで、tailを使用してログファイルの出力を別のファイルに書き込む必要があります。

ログファイルには以下が含まれます。

  I am Rahul.
  I have 5 oranges.
  The end.
  Something something.

「ついに」までは、すべてを別のファイルに書きたいです。

tail -f var/log/output.log 
| grep -m 1 "The end" | tee 
Abc.txt 

ただし、abc.txt ファイルには「End」のみが記録されます。

答え1

tail -f file | sed '/The end/q' | tee outfile

Sedは、「終了」が表示されるまですべての行を印刷し、その時点で終了します。

また、最近AskUbuntuで尋ねる

答え2

grepgrepストリームまたはファイルから一部のパターンに一致する行を抽出するため、ここでは使用できません。止める特定の文字列が見つかると出力されます。デフォルトでは、その行より前のすべての行と一致し、その行の後の行と一致しないgrepいくつかのパターンを指定する必要があります。The end.


sed '/The end\./q'

The end.このコマンドは、文字列を含む行が表示されるまで標準入力ストリームの各行を出力します。このとき最後の行が出力され、スクリプト内の命令をsed実行して命令が終了します。qsed

パイプラインの一部として:

tail -f var/log/output.log |
sed '/The end\./q' |
tee Abc.txt 

コマンドの実装に応じて、tailパイプはラインに遭遇するとすぐに終了するか、存在しないプロセスに書き込もうとするとThe end.すぐに終了します。つまり、ラインが見え、ラインが終了するとすぐに出力。tail -fsedThe end.sedSomething something.tail -f

tailOpenBSD(POSIXのようには動作しませんtail)では、最後に説明された動作が提供されますが、GNUはtail最初の動作(The end.行に遭遇するとすぐに終了)を提供します。

関連情報