Domanda

Sto scrivendo una semplice sceneggiatura a Bash, per analizzare alcuni tronchi in tempo reale e chiedendomi su come avvicinarsi al fatto, che ogni pochi secondi devo trovare posto nel file che ho finito di leggere il tempo precedente. In questo momento sto facendo qualcosa del genere:

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
.

Allora ogni ciclo che recupero un certo numero di linee dalla fine del file e cerco quella che è stata l'ultima nella corsa precedente.Questo funzionerà abbastanza bene fino a quando in un ciclo è più che verrà aggiunto il numero definito di linee.Posso sempre dire qualcosa come LINES=10000 ma in questo caso ci saranno tousand di esecuzioni inutili solo per determinare se ancora ho trovato l'ultima riga dalla corsa precedente. Mi chiedo se posso farlo un po 'più efficiente?

È stato utile?

Soluzione

Penso che stai cercando sth come questo:

#!/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
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top