Сценарий оболочки для чтения файла журнала из последней прочитанной строки - PullRequest
0 голосов
/ 05 марта 2019

Мое требование - прочитать файл журнала сервера (относительно большой), который постоянно обновляется, используя сценарий оболочки из задания cron.Я буду читать до последней доступной строки, чтобы найти строку и адрес электронной почты, если строка найдена.В следующий раз, когда запускается задание cron, задание должно считываться со строки или позиции, где оно было завершено в последний раз.Любые предложения, как я могу сделать это в сценарии оболочки.

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Я использую timeout для тайм-аута tail и использую некоторый файл сохранения для сохранения позиции строки, которую мы проанализировали:

# statefile where we save the number of parsed already lines
statefile=/tmp/statefile.txt

# initialize count variable - to zero, or from statefile
if [ -e "$statefile" ]; then
    count=$(<"$statefile")
else
    count=0
fi

# we timeout for 1 seconds outputting the lines
# the better timeout would be like 10 seconds for big file
# the `tail` command needs to jump `$count` lines inside the input file
timeout 1 tail -n +$count input_log_file |
# tee is used to pass the input to the updating part
tee >(
     # read number of parsed lines with `wc -l`
     # increment the count of parsed lines and save to statefile
     echo $(( count + $(wc -l) )) >"$statefile"
) |
# grep for the searched string
grep --line-buffered string_to_search |
# do the action if string_to_search is found
do_some_action_example_send_mail
0 голосов
/ 05 марта 2019

ниже, вы можете начать:

tail -f your_file | while read line
do case "$line" in
        *"string_to_search"*) echo "" | mutt -s "Guilty string found" a_mail@mail.com       
;;
   esac
done 
...