1つは、/location/of/thefile
常に変更されるログファイルです。平均リフレッシュ密度は毎分4回、可能な限り最大リフレッシュレートは毎分30〜40回です。更新するたびに平均2〜5行が追加されますが、極端な場合は何百も追加されることがあります。各行は[YYYY-MM-DD HH:MM:SS]
タイムスタンプで始まり、その後にプレーンテキスト(100〜200、最大数百文字)が続きます。
私の使命は簡単なコマンドこのログファイルを継続的に監視し、以下を含む各行を標準出力に送信します。foo
または bar
アルファベット文字列。これらの(サブ)文字列の前後に文字がある場合があります(\n
もちろん(サブ)文字列の後にのみ)\0
。でも。単語は、可能なすべてのバリアントで大文字で表記できます。
さて、解決策についての私の考えは常にタイミングシステムコールに関連していますが、それを使用してはいけません。私のために作ってください簡単なコマンド。とても感謝しています!
答え1
私は質問を間違って理解したかもしれませんが、これを使用できない理由はありますか?
tail -f /location/of/thefile | grep -i -E "foo|bar"
答え2
次のように名前付きパイプを使用します。
logfile.txt
ファイルを読み続けますreadfile.sh
。
# readfile.sh
while read line
do
echo $line
done < mypipe
$ mkfifo mypipe
$ #this will block (will not exit)
$ ./readfile.sh
他のシェルでは、しかし同じディレクトリ(mypipeファイルがある場所)に:
$ # This will go to background
$ tail -f logfile.txt >> mypipe &
完璧。 logfile.txtに入る内容はreadfile.sh
終了せずに印刷されます。