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 -fphiê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.