#!/bin/bash
sudo tail -fn0 /home/main/time.log |
grep -o --line-buffered 'garage\|garden\|porch' | head -1 |
while read line; do
sudo pkill -f porch.sh &
sudo pkill -f garage.sh &
done
我正在尝试编写一个监视日志的脚本,并在匹配关键字后会触发一些命令。
问题是,我拼凑的内容只能工作一次,然后退出并停止监视。
如果多个关键字同时出现在尾部,则我希望它在第一个关键字处执行,忽略其余关键字,执行列出的脚本,然后返回监视日志的尾部。我在grep中添加了“ head -1”,以在第一个匹配项后停止grep,但这也退出了grep,因此该脚本基本上停止了监视。
我希望脚本在与关键字匹配后保持活动状态,并继续监视日志尾部是否有可能被记录的新关键字。
任何建议都非常感谢。谢谢!
答案 0 :(得分:0)
可以使此代码更紧凑,更高效,但是这种冗长的形式将有助于您了解所发生的情况:
因此,基本思想是监视/home/main/time.log
并检查文件中的行数是否已更改,如果已更改,那么我们想找出添加了多少新行,我们将使用此变量来拖尾最后n个文件并对其进行grep,因为这是运行终止进程所需的条件。
touch last.keyfile
while true
do
old_line=$(cat last.keyfile)
n_lines=$(cat time.log | wc -l);echo $n_lines > last.keyfile
if [ -z $old_line ];then
old_line=$(echo "$n_lines")
fi
differ=$((n_lines-old_line))
if [[ $differ > 0 && $(tail -n"$differ" time.log | grep 'abc\|pub' | wc -l) > 0 ]];then
echo yes
fi
sleep 5
done
P.S。 :请在运行前进行相关更改。