4

ログ ファイルに特定のテキストが表示されたらすぐにコマンドを実行したいと考えています。Bashでそれを行うにはどうすればよいですか?

4

5 に答える 5

14

コマンドを使用

tail -f file.log | grep --line-buffered "my pattern" | while read line
do
  echo $line
done

がここ--line-bufferedでのキーです。そうしないと、読み取りが失敗します。

于 2008-10-01T11:19:40.727 に答える
5

のみを使用tail

tail -f file.log | while read line; do if [[ $line == *text* ]]; then
    mycommand
fi; done
于 2008-10-01T11:33:48.537 に答える
1

また、関心のあるファイルが変更された場合にのみ、フレームワークを使用してウェイクアップするinotailの代替品を見ることもできます。通常は、ポーリングの間に短い時間スリープするだけです。これは効果的ですが、あまり効率的なソリューションではありません。tail -finotifytail -f

于 2008-10-05T12:51:33.637 に答える
1

これは、GNU grep がなくても機能するはずです。

tail -f -n 0 logfile.out | nawk '/pattern/ {system("echo do something here")}'

編集: テキストの新しい出現のみが一致するように、「-n 0」を追加しました。

于 2008-10-01T11:31:24.253 に答える
0

私はマトリの答えが好きです。Bruno De Fraineの答えは、他のプログラム(awkなど)ではなく、シェルcコマンドのみを使用するという点でも優れています。行全体がマジックストリングと一致しなければならないという問題があります。要件の一部である質問からは明らかではありません。

元の質問の「すぐに」句を処理するために、少し変更します

logfile_generator | tee logfile.out | nawk '/pattern/ {system("echo do something here")}'

ここで、logfile_generatorは、最初にログファイルを生成しているプログラムです。この変更により、マジックストリングが見つかるとすぐに「何か」が実行されます。

于 2008-10-01T19:13:18.480 に答える