У попередній роботі я не міг отримати надійного спостерігача з просто командою-фу, тому у мене був скрипт для обгортки, як описаний нижче, який перевіряв файл кожні секунди опитування та збирав нові рядки для зацікавленої фрази.
#!/bin/bash
file=$1
phrase=$2
poll_duration=$3
typeset -i checked_linecount
typeset -i new_linecount
typeset -i new_lines
let checked_linecount=new_linecount=new_lines=0
echo "Watching file $file for phrase \"$phrase\" every $poll_duration seconds"
while [ 1 ]
do
let new_linecount=`wc -l $file| awk '{print $1}'`
if [[ $new_linecount > $checked_linecount ]]; then
let "new_lines = $new_linecount-$checked_linecount"
head --lines=$new_linecount "$file" | tail --lines=$new_lines | grep "$phrase" && beep
let checked_linecount=$new_linecount
fi
sleep $poll_duration
done
Це було на машині Unix. В Linux ви можете піти на краще, використовуючи його інтерфейс інотифікованого перегляду файлів. Якщо цей пакет ( inotify-tools на Ubuntu) присутній, замініть
sleep $poll_duration
з
inotifywait -e modify "$file" 1>/dev/null 2>&1
Цей виклик блокується, поки файл не буде змінено. Блокуюча версія майже така ж ефективна, як і те, що ви отримаєте з tail -f
версією, якби труба могла бути налаштована на роботу без буферизації.
Примітка: Сценарій спочатку робить а, head --lines=$new_linecount
щоб рядки, додані до файлу після того, як ми перевірили його, не перекручували фрагмент файлу, який перевіряється в цьому циклі.