我编写了一个脚本,只要我在静态文件上运行它,它(最终)就能按我想要的方式运行。有没有办法对实时文件进行 tail 操作,并让脚本在实时文件的每一行进入时对 tail 文件执行操作?
我试过
tail -f logfile.txt | ./myscript.sh
和
./myscript.sh <logfile.txt
但它们似乎都没有产生预期的结果。我的猜测是(在第一个示例中)myscript.sh 直到 tail -f 完成才会运行,这违背了目的 :)
我不知道为什么第二个例子不起作用......似乎应该起作用,但它读取了文件的所有内容,但没有读取进入 logfile.txt 的新行
答案1
这是一个简单的概念验证:
在 myscript.sh 中:
#!/bin/bash
while read -r line; do
echo "syslog says: $line"
done
然后在终端中:
$ tail -n 0 -F /var/log/syslog | ./myscript.sh
(请注意,我之所以使用是-n 0
因为我不想处理任何之前的日志内容;如果你想处理它全部然后将其更改为-n +1
从第一行开始执行尾部操作)。我还使用了-F
而不是-f
,这样如果原始文件变得无法访问(例如由于被轮换出),尾部将重试。
在不同的终端
$ logger "logger says hello"
你应该立即在第一个终端中看到类似
syslog says: Dec 11 13:48:54 T61p steeldriver: logger says hello
如果它不起作用,也许是因为写入日志文件的任何内容都是以缓冲方式进行的,或者您在脚本中以缓冲方式处理它(grep
有时是罪魁祸首:它有一个--line-buffered
在这种情况下可能有用的选项)。