连续读取bash脚本中日志文件的最后一行

连续读取bash脚本中日志文件的最后一行,bash,shell,file,logfile,Bash,Shell,File,Logfile,我有一个日志文件,其中不断写入新行 我想要一个连续读取此日志文件最后一行的bash脚本,以便我可以处理该行,例如,如果该行包含单词error,则执行特定命令 我试过: 虽然是真的 做 如果tail-n1-f file.log | grep-q错误 然后 echo$date:检测到错误 fi 完成 但这是垃圾邮件: sun 21 mar 2021 18:32:41 CET : ERROR detected sun 21 mar 2021 18:32:41 CET : ERROR detected

我有一个日志文件,其中不断写入新行

我想要一个连续读取此日志文件最后一行的bash脚本,以便我可以处理该行,例如,如果该行包含单词error,则执行特定命令

我试过:

虽然是真的 做 如果tail-n1-f file.log | grep-q错误 然后 echo$date:检测到错误 fi 完成 但这是垃圾邮件:

sun 21 mar 2021 18:32:41 CET : ERROR detected
sun 21 mar 2021 18:32:41 CET : ERROR detected
sun 21 mar 2021 18:32:41 CET : ERROR detected
sun 21 mar 2021 18:32:41 CET : ERROR detected
sun 21 mar 2021 18:32:41 CET : ERROR detected
sun 21 mar 2021 18:32:41 CET : ERROR detected
sun 21 mar 2021 18:32:41 CET : ERROR detected
sun 21 mar 2021 18:32:41 CET : ERROR detected
sun 21 mar 2021 18:32:41 CET : ERROR detected
sun 21 mar 2021 18:32:41 CET : ERROR detected
sun 21 mar 2021 18:32:41 CET : ERROR detected
sun 21 mar 2021 18:32:41 CET : ERROR detected
在本例中,每分钟添加一行


我怎样才能只读取最后一行,而不为结果发送垃圾邮件?

我建议GNU grep:

tail -n1 -f file.log | grep --line-buffered ERROR | while read; do echo "$(date) : ERROR detected"; done
这正是发明tail-f的原因:

tail -f <logfile>
就你而言:

tail -f file.log | grep "ERROR"

-如果希望tail的单个副本无限期运行,则使用f。如果以这种方式使用,则不需要将其放入更大的循环中,因为单个副本不会退出。当然,您需要编写脚本的其余部分,以使用不会退出的长时间运行的程序。此外,您还需要配置用于向脚本发送信号的任何日志旋转工具,以便在日志文件被替换为与原始文件同名的新文件时,它可以启动tail的全新副本……也就是说,一开始最好不要重新发明这个轮子。有很多很好的工具可以在生成日志时将日志输入到分析工具中——旧式的pre ElasticSearch acquisition logstash是我个人最喜欢的工具之一,但也没有什么比选项短缺更为遥远的了——这些工具已经被积极维护,并且在大量生产中使用了多年,甚至几十年。构建自己的,您需要重新学习编写现有选项所需的所有课程。此外,您当前的循环可能会遗漏行-如果将20行写为一个块会发生什么情况,因此tail-n1从n行直接跳到n+20行,因此您遗漏了它们之间的错误?谢谢,这正是我想要的!
tail -f file.log | grep "ERROR"