我正在尝试读取一个不断变化的日志文件(即文本文件)并对该文件中的某些文本生成警报。我想通过 bash 脚本来做到这一点,但我很困惑,一旦一些文本进入该日志文件,我将如何调用我的程序。
换句话说,我怎样才能一直检查该文件,以便每当某些特定文本进入该文件时,我都会收到有关该文本的警报。任何函数调用?或者是其他东西?请指教。
也许这可以让你开始。试试这个 test.sh 脚本:
#/bin/sh
while read line
do
echo `date` " $line"
done
现在尝试像这样调用它(qwe 是一个带有一些行的简单文本文件):
./test.sh < qwe
它将从 qwe 读取行并打印它们直到 EOF。
现在像这样调用它:
tail -f qwe | ./test.sh
现在它将读取这些行,但它不会在 EOF 处停止,而是等待下一行。
如果您在单独的终端中执行此操作:
`echo "hi" >> qwe`
你看..
我想我会这样做的方式是:
首先,我将创建一个 bash 脚本和一个文本文件,bash 脚本将首先将该日志文件的行数存储在文本文件中,然后添加该脚本的 cron。
该脚本将计算该文件的行数并将其与存储在文本文件中的行数进行比较
你可以使用命令来做到这一点
wc -l filename
如果行数较大,则日志已更新,我将计算当前行数减去存储在文本字段中的数字,由此我将知道自上次检查以来添加了多少行,然后使用它获取这些行的命令
tail -n $number_of_lines filename
如果其中一行符合您的条件,我将遍历输出并执行所需的操作,然后更新包含行数的文本文件,我会为您编写 bash 脚本,但我想您明白了
编辑:您可以执行此脚本(只需编写搜索匹配项等的代码)
#!/bin/bash
NUMBER=`/bin/cat ./numberoflines`
LINES=`/usr/bin/wc -l < /var/log/messages`
DIFFERENCE=$(($LINES-$NUMBER))
if [ $DIFFERENCE != 0 ]; then
tail -n $DIFFERENCE /var/log/messages |while read line
do
if $( echo $line | grep --quiet 'New USB device found' )
then
# Email text/message
EMAIL='youremail@gmail.com'
SUBJECT="New USB device found"
EMAILMESSAGE="/tmp/emailmessage.txt"
echo "New USB device found etc ..." > $EMAILMESSAGE
/bin/mail -s "$SUBJECT" "$EMAIL" < $EMAILMESSAGE
fi
done
echo "$LINES" > ./numberoflines
fi
即使您无法向 crons 添加任何内容,您仍然可以执行此脚本,查看您想要匹配的内容并检查并执行您需要的代码
watch -n 0.1 cat /proc/uptime
其中 n 是以秒为单位的间隔时间。
man watch
了解更多信息。