Pregunta

Estoy escribiendo un script simple en Bash, para analizar algunos registros en tiempo real y preguntándose sobre cómo abordar el hecho, que cada pocos segundos tengo que encontrar lugar en el archivo que terminé de leer el tiempo anterior. Ahora mismo estoy haciendo algo como esto:

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

Entonces, cada ciclo, estoy buscando algunos números de líneas desde el final del archivo y busco el que fue el último en la ejecución anterior.Esto funcionará bastante bien hasta que en un ciclo se agregarán más que se agregarán el número de líneas definidas.Siempre puedo decir algo como LINES=10000, pero en este caso habrá tousands de carreras inútiles solo para determinar si aún encontré la última línea de la ejecución anterior. Me pregunto si puedo hacerlo un poco más eficiente?

¿Fue útil?

Solución

Creo que estás buscando algo así:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top