监视文件并根据该文件的更改执行命令

监视文件并根据该文件的更改执行命令

我正在寻找一种当关键字出现在给定文件中时执行命令的方法,例如temp.txt.目前,我已经尝试过tail -F temp.txt | awk '/keyword/ {echo found}'。期望的目标是仅在包含 的echo found新行添加时才执行。我想用基本命令找到最简单的解决方案。temp.txtkeyword

我觉得这个链接帖子的答案就是我想要的,但它对我不起作用,我不明白为什么。

当日志中出现某些文本时跟踪日志并执行命令的最佳方法

答案1

尝试:

while :; do awk '/keyword/{print "found"}'; sleep 1; done < temp.txt

或者如果你想执行 shell 命令而不是仅仅打印“found”:

while :; do awk '/keyword/{system("echo \047found\047"}'; sleep 1; done < temp.txt

它使用强制 POSIX 命令,并且可以在每个 Unix 机器上的任何 shell 中工作。例如:

$ echo foo > temp.txt

$ while :; do awk '/keyword/{print "\n>>> found <<<\n"}'; sleep 1; done < temp.txt &
[1] 16520

$ echo keyword >> temp.txt
$
>>> found <<<

https://unix.stackexchange.com/a/629912/133219有关该方法的更多信息。

如果“关键字”不经常出现在文件中,并且您关心使用 CPU 周期在后台旋转的循环,那么您可以通过每次循环时将睡眠值加倍到某个最大值来获得更奇特的睡眠值未找到关键字,因此代码休眠的时间远多于执行的时间,类似于以下 bash 代码,但可以为任何 shell 编写:

secs=1
maxSecs=60
while :; do
    if awk '/keyword/{print "found"; f=1} END{exit !f}'; then
        secs=1
    else
        if (( (2*secs) < maxSecs )); then
            secs=$(( 2*secs ))
        else
            secs=$maxSecs
        fi
    fi
    sleep "$secs"
done < temp.txt

当“关键字”在文件中快速出现时,它将每秒运行 awk 一次,如果不是,它将逐渐循环到每分钟调用 awk 一次,直到“关键字”开始再次出现,然后开始调用 awk 一次再次每秒。显然,将 maxSecs 设置为您喜欢的任何值 - 5、30、3600,等等。

相关内容