Trong một công việc trước đây, tôi không thể có được một trình theo dõi đáng tin cậy chỉ bằng lệnh-fu, vì vậy tôi đã có một kịch bản trình bao bọc như bên dưới, nó đã kiểm tra tệp mỗi giây poll_duration và đưa ra các dòng mới cho cụm từ quan tâm.
#!/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
Đây là trên một máy Unix. Trên Linux, bạn có thể cải thiện tốt hơn bằng cách sử dụng giao diện filewatcher inotify của nó . Nếu gói này ( inotify-tools trên Ubuntu) có mặt, hãy thay thế
sleep $poll_duration
với
inotifywait -e modify "$file" 1>/dev/null 2>&1
Cuộc gọi này chặn cho đến khi tập tin được sửa đổi. Phiên bản chặn gần như hiệu quả như những gì bạn nhận được với tail -f
phiên bản nếu đường ống có thể được cấu hình để hoạt động mà không cần đệm.
Lưu ý: Trước tiên, tập lệnh thực hiện head --lines=$new_linecount
để đảm bảo rằng các dòng được thêm vào tệp sau khi chúng tôi kiểm tra nó không làm lệch đoạn của tệp được kiểm tra trong vòng lặp này.