我正在尝试读取不断变化的日志文件(即文本文件),并对该文件中的某些文本生成警报。我想通过bash脚本来实现它,但我很困惑,只要有些文本进入该日志文件,我将如何调用我的程序。
换句话说,如何在该文件上一直检查,以便每当某个特定文本进入该文件时,我都会收到有关该文本的警报。任何函数调用?或者是其他东西?请指教。
答案 0 :(得分:5)
也许这可以帮助你入门。试试这个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`
你看..
答案 1 :(得分:2)
我认为我会这样做的方式是:
首先,我将创建一个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添加任何内容,您仍然可以执行此脚本,查看您要匹配的内容并检查并执行您需要的代码
答案 2 :(得分:0)
watch -n 0.1 cat /proc/uptime
其中n是以秒为单位的间隔时间。
待办事项
man watch
了解更多信息。