Frage

Ich schreibe ein einfaches Skript in Bash, um einige Protokolle in Echtzeit zu analysieren, und frage mich, wie ich mit der Tatsache umgehen soll, dass ich alle paar Sekunden einen Platz in der Datei finden muss, die ich beim letzten Mal gelesen habe.Im Moment mache ich so etwas:

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

Also hole ich in jedem Zyklus eine bestimmte Anzahl von Zeilen vom Ende der Datei ab und suche nach der Zeile, die im vorherigen Durchlauf die letzte war.Dies funktioniert solange einwandfrei, bis in einem Zyklus mehr als die definierte Anzahl Zeilen hinzugefügt wird.Ich kann immer so etwas sagen wie LINES=10000 aber in diesem Fall wird es Tausende nutzloser Durchläufe geben, nur um festzustellen, ob ich die letzte Zeile aus dem vorherigen Durchlauf schon gefunden habe.Ich frage mich, ob ich es etwas effizienter machen kann?

War es hilfreich?

Lösung

Ich glaube, Sie suchen nach so etwas:

#!/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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top