En un trabajo anterior, no pude conseguir un observador fiable con solo comando-fu, así que tenía un guión envoltorio como la de abajo, que inspeccionó el archivo cada poll_duration segundos y grepped las nuevas líneas para la frase interesados.
#!/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
Esto estaba en una máquina Unix. En Linux, puede ir mejor usando su interfaz inotify filewatcher. Si este paquete ( inotify-tools en Ubuntu) está presente, reemplace
sleep $poll_duration
con
inotifywait -e modify "$file" 1>/dev/null 2>&1
Esta llamada se bloquea hasta que se modifica el archivo. La versión de bloqueo es casi tan eficiente como lo que obtendría con la tail -f
versión si la tubería se pudiera configurar para funcionar sin almacenamiento en búfer.
Nota: El script primero hace una head --lines=$new_linecount
para garantizar que las líneas agregadas al archivo después de que lo verifiquemos no sesguen el fragmento del archivo que se verifica en este bucle.