BASH tail日志文件并在匹配条件下发送邮件

BASH tail日志文件并在匹配条件下发送邮件,bash,email,Bash,Email,Bash完全不懂,但正在努力学习完成这项任务 我需要一个脚本,可以尾随一个日志文件的最后50行,寻找字符串“错误”,并发送电子邮件,如果该条件是真的 我可以手动完成一些零碎的工作,但无法构建完全可以粘贴到cron中的东西。Sendmail可以自己工作 tail -n 50 /var/log/unifi-video/recording.log | grep ERROR 至少能输出那个。理想情况下,只有在最后50行中发现错误时,我才想要一封电子邮件,否则不需要采取任何行动。如果有人能帮助If/el

Bash完全不懂,但正在努力学习完成这项任务

我需要一个脚本,可以尾随一个日志文件的最后50行,寻找字符串“错误”,并发送电子邮件,如果该条件是真的

我可以手动完成一些零碎的工作,但无法构建完全可以粘贴到cron中的东西。Sendmail可以自己工作

tail -n 50 /var/log/unifi-video/recording.log | grep ERROR

至少能输出那个。理想情况下,只有在最后50行中发现错误时,我才想要一封电子邮件,否则不需要采取任何行动。如果有人能帮助If/else语句实现这一点,我们将不胜感激。

如果您希望在一行中实现这一点,您可以使用以下内容:

[ $(tail -n 50 /var/log/unifi-video/recording.log | grep ERROR | wc -l) -gt 0 ] && yourmailcommand
这只是将
grep
的输出通过管道传输到
wc-l
,后者返回从grep返回的行数。如果该计数大于0,则它将在双安培数之后执行该位。如果要在未找到
错误
行的情况下包含
else
,可以:

[ $(tail -n 50 /var/log/unifi-video/recording.log | grep ERROR | wc -l) -gt 0 ] && yourmailcommand || dosomethingelseinstead

grep
如果找到匹配项,则退出状态为0,如果未找到匹配项,则退出状态为1,类似

 tail -n 50 /var/log/unifi-video/recording.log | grep -q ERROR && <sendmail command here>
tail-n50/var/log/unifi video/recording.log | grep-q错误&&

我会做你想做的。(
-q
选项禁止任何输出,因为您不关心实际匹配的行,只关心找到了匹配项。)

这看起来应该可以工作。我一定是想得太多了,我试着做一个函数,把结果传给一个字符串变量,然后通过电子邮件发送出去。语法毁了我。今天我将使用此解决方案,并让您知道我的情况。非常感谢!也许,作为
mail
命令或
mutt
命令的一部分,或者作为此行的一部分使用的任何邮件命令,您都可以获取
tail-50/var/log/unifi video/recording.log作为正文或附件。也许在此测试行之前,您可以使用
tail-50 | last50errfile.txt
,然后您可以使用
mutt-a last50errfile.txt
,然后在测试行之后使用
rm last50errfile.txt
。不必太复杂。谢谢你,我删除了我之前发布的评论,没有考虑它可能受到攻击的各种方式。我必须用&&| | |详细解释一下为什么您的解决方案有效,我明白了为什么我的尝试破坏了它。在BASH中玩游戏既有趣又令人沮丧。是的。。那
&&
II
是bash的诡计,它允许你在
if
语句中速记
。它对于将简单的
if
类型压缩到一行非常有用。同样的语句可以作为更传统的
if
,如果在
then
块中有不止一件事情要做,那么最好将其扩展为正式的
if