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

Continuously read the last line of log file in bash script

我有一个不断写入新行的日志文件。

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

我试过:

while true
do
    if tail -n1 -f file.log | grep -q ERROR
    then
        echo "$(date) : ERROR detected"
    fi
done

但这是垃圾邮件:

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>

将显示日志文件的最后一行,因此您可以关注添加的内容。

这可以与 grep 组合:

tail -f <logfile> | grep <text_to_be_searched>

你的情况:

tail -f file.log | grep "ERROR"