实时日志分析器 - 每隔几秒进行一次文件访问

时间:2014-02-25 10:48:56

标签: bash log-analysis

我正在用bash编写简单的脚本,实时分析一些日志,并想知道如何处理这个事实,每隔几秒我就必须找到我之前读完的文件中的位置。 现在我正在做这样的事情:

LOG_FILE=path_to_file
DELAY=1   #time between refresh
LINES=100 #lines to read at one cycle

LAST=$(tail -n 1 $LOG_FILE)      

IFS=$'\n'
while true;
do
    clear;
    found=0
    LOG=$(tail -n $LINES $LOG_FILE)
    for line in $LOG
    do
        if [ $line = $LAST ]; then 
            found=1
            continue
        fi        
        if [ $found = 0 ]; then
            continue
        fi
        #Analyzing counting nd stuff.
        echo "$stuff"
    done
    LAST=$line
    sleep $DELAY;
done

所以每个循环我从文件末尾获取一些行,并寻找上一次运行中的最后一行。这将非常正常,直到在一个循环中将添加更多定义的行数。我可以总是说LINES=10000之类的东西但是在这种情况下会有成千上万的无用运行只是为了确定我是否找到了上次运行的最后一行。 我想知道我能不能提高效率呢?

1 个答案:

答案 0 :(得分:1)

我认为你正在寻找这样的事情:

#!/bin/bash
GAP=10     #How long to wait
LOGFILE=$1 #File to log to

if [ "$#" -ne "1" ]; then
    echo "USAGE: `basename $0` <file with absolute path>"
    exit 1
fi


#Get current long of the file
len=`wc -l $LOGFILE | awk '{ print $1 }'`
echo "Current size is $len lines."

while :
do
    if [ -N $LOGFILE ]; then
        echo "`date`: New Entries in $LOGFILE: "
        newlen=`wc -l $LOGFILE | awk ' { print $1 }'`
        newlines=`expr $newlen - $len`
        tail -$newlines $LOGFILE
        len=$newlen
    fi
sleep $GAP
done
exit 0