Analizador de registro de tiempo real - acceso de archivos cada pocos segundos
-
21-12-2019 - |
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?
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