محلل سجل الوقت الحقيقي - الوصول إلى الملفات كل بضع ثوان

StackOverflow https://stackoverflow.com//questions/22011879

  •  21-12-2019
  •  | 
  •  

سؤال

أنا أكتب سيناريو بسيط في باش ، لتحليل بعض السجلات في الوقت الحقيقي ، ويتساءل عن كيفية التعامل مع حقيقة ، أن كل بضع ثوان لا بد لي من العثور على مكان في الملف الذي انتهيت من القراءة في المرة السابقة.الآن أنا أفعل شيئا من هذا القبيل:

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 ولكن في هذه الحالة سيكون هناكالآلاف من أشواط عديمة الفائدة فقط لتحديد ما إذا كنت قد وجدت السطر الأخير من التشغيل السابق.أتساءل عما إذا كان بإمكاني القيام بذلك بشكل أكثر كفاءة إلى حد ما?

هل كانت مفيدة؟

المحلول

أعتقد أنك تبحث عن مثل هذا:

#!/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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top