/location/of/thefile
は、継続的に変更されるログファイルです。リフレッシュの平均密度は1分あたり4であり、可能な最大リフレッシュレートは1分あたり30〜40です。更新ごとに2〜5行(平均)が追加されますが、極端な場合には数百行になることもあります。すべての行は[YYYY-MM-DD HH:MM:SS]
タイムスタンプで始まり、その後にプレーンテキストが続きます(100〜200、最大数百文字)。
私のタスクは、このログファイルを継続的に監視し、foo
[〜#〜を含むすべての行をstdoutに送信する簡単なコマンドを作成することです。 ]または[〜#〜]bar
アルファベット文字列。これらの(サブ)文字列の前後には、\n
も含めて、任意の文字(もちろん、(サブ)文字列の後にのみ\0
)を含めることができます。単語の大文字はすべての可能なバリエーションである可能性があります。
まあ、解決策の私のアイデアは常にタイミングのためのシステムコールを含んでいますが、私はそれらを使うべきではありません。 簡単なコマンドを作成してください。どうもありがとうございました!
誤解しているかもしれませんが、使えない理由はありますか?
tail -f /location/of/thefile | grep -i -E "foo|bar"
次のような名前付きパイプを使用します。
継続的に読み取るファイル:logfile.txt
コード:(readfile.shといいます)行の読み取り中に$ lineがエコーされました<mypipe
シェル:
mkfifo mypipe ./readfile.shこれはブロックします(終了しません)
別のシェルで、同じディレクトリに移動します。
tail -f logfile.txt >> mypipe&これはバックグラウンドになります
できました。 logfile.txtに何度も入ってくると、終了しなかったreadfile.shを介して出力されます。