1

/ var / log/messagesなどの特定のログファイルから「Errors|Notice|Warnings」のような複数の文字列の出現を検出するシェルスクリプトを作成したいと思います。いずれかの文字列が一致する場合は、指定されたメールIDにメール通知を送信する必要があります。

使うことができます:

grep -i -E '^Errors|Notice|Warnings' /var/log/messages

しかし、私の主な問題は、ログファイルが常に大きくなることです。このスクリプトをcronで追加したい場合、スクリプトの最後の実行ですでに確認したファイル行または内容を記録するにはどうすればよいですか?

たとえば、ログファイルが100行で、catなどを使用してファイルを読み取った場合、2回目の実行前に、ファイルは300行になります。次に、101行番号から300行まで読み取ります。

誰かが私がこれを記録する方法を提案できますか?

4

2 に答える 2

3

次のスクリプトを使用してこれを行うことができます。

start=0

[[ -f last-processed ]] && start=$(<last-processed)

start=$((start+1))

tail +$start /var/log/messages | grep -i -E 'Errors|Notice|Warnings' &&\
wc -l /var/log/messages | awk '{print $1}' > last-processed

ところで、正規表現に問題がある場合は、'Errors|Notice|Warnings'代わりに '^Errors|Notice|Warnings'

于 2012-01-26T19:47:32.880 に答える
1

ログファイルをローテーションすることが最善の解決策になる可能性があります。

ただし、からファイルをgrepline_firstするline_last場合は、次を使用できますsed

たとえば、入力ストリームから100から110までの行を取得します。

$> line_first=100; line_last=110
$> seq 1 1000 | sed -n "${line_first},${line_last}p"
100
101
102
103
104
105
106
107
108
109
110
于 2012-01-26T19:42:17.090 に答える