元のコードを再フォーマットして、追加したパイプラインを強調表示しました
/bin/sed -i /status=/!d /var/log/maillog \
| (/bin/grep "status=bounced" /var/log/maillog \
| /bin/grep -E -o --color "\b[a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+\b" \
| /bin/sort -u >> /root/unsent.log\
) \
| (/bin/grep "status=deferred" /var/log/maillog \
| /bin/grep -E -o --color "\b[a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+\b" \
| /bin/sort -u >> /root/deferred.log\
) \
| (/bin/grep "status=sent" /var/log/maillog \
| /bin/grep -E -o --color "\b[a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+\b" \
| /bin/sort -u >> /root/sent.log \
) \
| /bin/sed -i "/status=/d" /var/log/maillog
@alberge が指摘したように、このすべてのsed -i
処理が同じファイルで行われると、ログ メッセージが失われる可能性が非常に高くなります。
別のアプローチを提案します。
メールログを日付付きのファイル名に移動します (ここでの仮定は、Postfix が使用するのが「好きな」標準名 (/var/log/maillog) で新しいファイルを作成することです)。
次に、実際の目標は、さまざまなカテゴリのメッセージを個別に名前を付けたファイル、つまり unsent.log、deferred.log、sent.log に抽出することであり、文字列を含まない行を破棄することですstatus=
(ただし、そうします)最初)。
これが私の代替案です(メッセージ全体を読んでください。すぐにコピー/貼り付け/実行しないでください!)。
logDate=$(/bin/date +%Y%m%d.%H%M%S)
/bin/mv /var/log/maillog /var/log/maillog.${logDate}
/bin/grep "status=bounced" /var/log/maillog.${logDate} \
| /bin/grep -E -o --color "\b[a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+\b" \
| /bin/sort -u \
>> /root/unsent.log.${logDate}
/bin/grep "status=deferred" /var/log/maillog.${logDate} \
| /bin/grep -E -o --color "\b[a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+\b" \
| /bin/sort -u \
>> /root/deferred.log.${logDate}
/bin/grep "status=sent" \
| /bin/grep -E -o --color "\b[a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+\b" \
| /bin/sort -u \
>> /root/sent.log.${logDate}
このコードが機能していることをテストするには、2 行目 ( /bin/mv ....
) を次のように置き換えます。
/bin/cp /var/log/maillog /var/log/maillog.${logDate}
それをターミナル ウィンドウに/var/log/maillog.${logDate}
コピー アンド ペーストし、正しくコピーされたことを確認してから、各セクションを一度に 1 つずつコピー アンド ペーストし、期待される出力が各/root
ログ ファイルに作成されていることを確認します。
(これらのブロックのいずれかでエラー メッセージが表示された場合は、継続する各行の最後の '\' 文字の後にスペース/タブ文字がないことを確認してください。または、これら 3 つのパイプラインのそれぞれを 1 行に折りたたんで、あなたが行くように「\」文字。
(各ログファイルを作成するために、/root
サブプロセスで囲まれたパイプを介して接続セクションを使用しないことに注意してください。しかし、他の状況では、高度な問題に対してこの種の手法を使用するため、手法をスローしないでください本当に必要なときにだけ使用してください;-)!
これらすべてが必要に応じて機能していることを確認したら、スクリプトを拡張して最終的なクリーンアップを行います。
/bin/rm /var/log/maillog.${logDate}
${logDate}
各出力ファイルに追加しましたが、使用しsort -u >>
ているように、サブログファイル名 (unsent.log、deferred.log、sent.log) の「拡張子」を削除することをお勧めします。これらのファイルは自然に大きくなります。どちらの場合も、ある時点で戻ってきて、このデータをどれくらい前に保持したいかを決定し、これらのログファイルが役に立たないときにどのようにクリーンアップするかについて計画と方法を開発する必要があります。logrotate
誰かがパッケージについて言及したと思います。長期的な解決策として、それを検討することをお勧めします。
このソリューションにより、多くの余分なプロセスが作成されることが回避され、ログ レコードが失われる可能性が (ほとんど) なくなります。ファイルを移動しているのと同じ一瞬で Postfix がログファイルに書き込んでいると、レコードの全部または一部が失われる可能性があると思います。しかし、あなたのソリューションには、同様の問題があり、それが発生する可能性が高くなります。
( .... ) | ( .... )
ネストされたサブプロセスを使用して、設計の意図を誤解した場合は、申し訳ありません! 投稿を更新して、その手法を使用する理由を含めることを検討してください。
これが役立つことを願っています。