Analisi del registro in tempo reale - Accesso al file Ogni pochi secondi
-
21-12-2019 - |
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?
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
.