我已重新格式化您的原始代码以突出显示您添加的管道
/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
sed -i
正如@alberge 指出的那样,在同一个文件上进行所有这些处理时,您很可能会丢失日志消息。
我提出了一种不同的方法:
我会将邮件日志移动到一个过时的文件名,(这里的假设是 Postfix 将创建一个具有它“喜欢”使用的标准名称的新文件(/var/log/maillog)。
那么您的真正目标似乎是将各种类别的消息提取到单独命名的文件中,即 unsent.log、deferred.log、send.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}
要测试此代码是否正常工作,请将第二行 ( /bin/mv ....
)替换为
/bin/cp /var/log/maillog /var/log/maillog.${logDate}
将其复制/粘贴到终端窗口中,确认复制正确,然后复制/粘贴每个部分,一次 1 个,并检查每个日志文件/var/log/maillog.${logDate}
中是否创建了预期的输出。/root
(如果您收到任何这些块的错误消息,请确保在每一行的最后一个 '\' 字符之后没有空格/制表符字符。或者您可以将这 3 个管道中的每一个折叠回一行,删除'\' 字符随你去。
(请注意,为了创建每个/root
日志文件,我不使用任何通过被子进程包围的管道的连接部分。但是,在其他情况下,我确实使用这种技术来解决高级问题,所以不要扔技术离开,只在真正需要时使用它;-)!
在您确认所有这些都按您的需要工作后,您可以扩展脚本以进行最后的清理:
/bin/rm /var/log/maillog.${logDate}
我已添加${logDate}
到您的每个输出文件中,但正如我看到您正在使用的那样,sort -u >>
您可能希望删除子日志文件名称(unsent.log、deferred.log、send.log)的“扩展名”,然后让这些文件自然增长。在任何一种情况下,您都必须在某个时候返回并确定您希望将这些数据保留多长时间,并制定计划和方法来在这些日志文件无用时如何清理它们。我想有人提到logrotate
包。您可能希望将其视为您的长期解决方案。
该解决方案避免了创建大量额外进程,并且(大部分)消除了丢失日志记录的可能性。我认为如果 Postfix 在您移动文件的同一瞬间写入日志文件,您可能会丢失全部或部分记录。但是您的解决方案会有类似的问题,并且有更多的机会发生这种情况。
如果我误解了您的设计意图,使用嵌套( .... ) | ( .... )
子流程,对不起!考虑更新您的帖子以包含您使用该技术的原因。
我希望这有帮助。