如何读取动态变化的文件

时间:2012-04-15 10:15:05

标签: linux bash

我正在尝试读取不断变化的日志文件(即文本文件),并对该文件中的某些文本生成警报。我想通过bash脚本来实现它,但我很困惑,只要有些文本进入该日志文件,我将如何调用我的程序。

换句话说,如何在该文件上一直检查,以便每当某个特定文本进入该文件时,我都会收到有关该文本的警报。任何函数调用?或者是其他东西?请指教。

3 个答案:

答案 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  了解更多信息。