실시간 로그 분석기 - 몇 초마다 파일 액세스
-
21-12-2019 - |
문제
저는 Bash에서 간단한 스크립트를 작성하고 실시간으로 일부 로그를 분석하고 사실에 접근하는 방법에 대해 궁금해합니다. 몇 초마다 이전 시간을 읽은 파일에서 장소를 찾아야합니다. 지금 당장 나는 이렇게하고 있습니다 :
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
.
그래서 모든 사이클 파일의 끝에서 몇 가지 줄을 가져 와서 이전 실행의 마지막 실행 중 하나를 찾고 있습니다.정의 된 수의 줄 수가 추가 될 때까지 한 번의 순환이 될 때까지 이것은 꽤 잘 작동합니다.나는 항상 LINES=10000
와 같은 것을 말할 수 있지만이 경우 쓸모없는 unsand는 이전 실행에서 마지막 줄을 발견했는지 확인하기 위해 쓸모없는 실행이 있습니다.
나는 내가 더 효율적으로 다소 효율적으로 할 수 있는지 궁금합니다.
해결책
나는 당신이 그렇게 sth를 찾고 있다고 생각합니다 :
#!/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
. 제휴하지 않습니다 StackOverflow