Làm thế nào để bíp trên sự kiện đuôi -f


14

Tôi muốn PC của mình tạo ra tiếng bíp hệ thống trên mỗi sự kiện đuôi

Tôi có lệnh sau

tail -f development.log | grep "something rare"

Có cách nào dễ dàng như đặt nó vào một cái gì đó có tiếng bíp không? như

tail -f development.log | grep "something rare" | beep

Nếu vậy thì đầu ra grep vẫn sẽ được hiển thị?


có một chương trình tiếng bíp với trong repo mặc định cho debian và các biến thể chỉ là apt-get install beep nhưng nó không hoạt động với đường ống theo cách này
Jakob Cosoroaba

Câu trả lời:


16

Chỉ cần định nghĩa beepnhư sau:

beep() { read a || exit; printf "$a\007\n"; beep; }

Sau đó, bạn có thể sử dụng lệnh của mình:

tail -f development.log | grep "something rare" | beep

1
xin lỗi nhưng nó không hoạt động, nó không có tiếng bíp hoặc in bất cứ thứ gì
Jakob Cosoroaba

4
Mặc dù đầu ra trực tiếp của đuôi -f là ngay lập tức, nó được đệm ngay khi nó đi qua một đường ống. Bạn phải đợi đủ "thứ gì đó hiếm" trước khi quan sát bất cứ thứ gì.
mouviciel

Bạn có thể chuyển đầu ra qua sedhoặc tương tự (giữa đuôi và grep) với một biểu thức chính quy thay thế something rarebằng chính nó nhiều lần. Bao nhiêu lần nó cần phải được thực hiện tùy thuộc vào bao nhiêu đường ống được đệm.
David Spillett

6
@David - Đó là một cách tiếp cận hit-and-miss. Nếu bạn muốn hủy kết nối dữ liệu được truyền qua một đường ống, hãy sử dụng bất kỳ phương thức nào được mô tả trong các câu trả lời sau: stackoverflow.com/questions/1000674/turn-off-buffering-in-pipe
nagul

2
Thoát khỏi gợi ý của @ nagul, đây là lời mời làm việc cho tôi:tail -f development.log | stdbuf -oL -eL grep "something rare" | beep
GuitarPicker

10

Màn hình GNU có tính năng tích hợp để phát ra tiếng bíp khi một cửa sổ cụ thể thay đổi: xem phần có liên quan của trang man .

Tóm tắt tiêu đề:

$ screen
$ tail -f yourfile.log    # inside the screen session
<C-a> M    # "Window 0 (bash) is now being monitored for all activity."

Như đã chỉ ra trong các bình luận, điều này sẽ phát ra tiếng bíp trên mỗi mục nhật ký mới, không chỉ những mục phù hợp với "thứ gì đó hiếm", vì vậy điều này không làm đúng như những gì OP yêu cầu. Vẫn là một mẹo hữu ích để biết IMHO.

Bạn có thể tận dụng tốt nhất cả hai thế giới bằng cách mở hai screencửa sổ ( <C-a> cđể mở một cửa sổ, <C-a> <C-a>để chuyển đổi giữa hai cửa sổ):

  1. theo dõi, với tail -f yourfile.log | grep 'something rare'
  2. không được giám sát, với một đồng bằng tail -f yourfile.log

Sau đó, bạn có thể ngồi xem cuộn nhật ký trong cửa sổ 2 và bạn sẽ phát ra tiếng bíp từ cửa sổ 1 khi "điều gì đó hiếm gặp" xảy ra.

screen là rất linh hoạt - tôi khuyên bạn nên đọc nó.


1
Điều đó sẽ không có tiếng bíp chỉ trên "một cái gì đó hiếm", phải không?
nagul

1
Nó sẽ xảy ra nếu tất cả những gì đã xảy ra trong cửa sổ cụ thể đó tail -f yourfile.log | grep something\ rarechứ không chỉ làtail -f logfile
David Spillett

Rất tiếc, tôi không nhận thấy rằng anh ta chỉ muốn có tiếng bíp something rare. Chỉnh sửa để phản ánh điều này. Grep sẽ hoạt động, nhưng sau đó anh ta sẽ không thấy phần còn lại của nhật ký, chỉ có những dòng hiếm - vì tôi hiểu rằng anh ta muốn có thể xem toàn bộ nhật ký cuộn qua, nhưng được cảnh báo về các sự kiện cụ thể.
Sam Stokes

1

Bạn có thể ngăn đầu ra không được đệm trong lệnh grep. Xem người đàn ông grep để biết chi tiết.

Bạn có thể chuyển đầu ra grep thành tiếng bíp.

Ví dụ sau đây là từ người đàn ông bíp ...

   As part of a log-watching pipeline

          tail -f /var/log/xferlog | grep --line-buffered passwd | \
          beep -f 1000 -r 5 -s

Có rất nhiều thứ hay ho trong những hướng dẫn sử dụng. Giá như chúng ta không phải đọc chúng để tìm nó. ;-)


1

Lệnh xem có tùy chọn --beep và bạn cũng có thể đặt khoảng thời gian bỏ phiếu, nhưng tiêu chuẩn với 2 giây sẽ ổn

watch --beep 'tail development.log | grep "something rare"'

1
Lưu ý, watchhoạt động bằng cách chạy tham số / lệnh của bạn mỗi phần (khoảng) sau đó đến kết quả cho lần chạy trước. Do đó, bạn sẽ muốn sử dụng phiên bản bình thường của lệnh đuôi, thay vì sử dụngtail -f
RyanWilcox

Điều này không hiệu quả với tôi (mặc dù thêm watch --beepvà quấn đuôi / grep, tôi vẫn không có tiếng bíp).
máy tính

1

Bạn có thể sử dụng sed để thêm control-G như sau:

tail -f myFile | sed "s/.*/&\x07/"

hoặc chỉ trên các dòng hiếm, không sử dụng grep, như sau:

tail -f myFile | sed -n "/something rare/s/.*/&\x07/p"

mà nói: trên đường nơi một cái gì đó hiếm xảy ra, s ubstitute tất cả mọi thứ cho những thứ tương tự với kiểm soát-G tacked ở cuối dòng, và in (nhưng không in các dòng không phù hợp). Hoạt động tuyệt vời!


0

Hừm, gian xảo. Có lẽ chúng ta có thể làm một cái gì đó như thế này?

for i in `find | grep 7171`; do beep; echo $i; done

Hoặc trong trường hợp của bạn

for i in `tail -f development.log | grep "something rare"`; do beep; echo $i; done

Nó dường như được thực hiện một số bộ đệm mặc dù. Tôi sẽ xem xét nếu có cách tắt bộ đệm này bằng forvòng lặp.

Rõ ràng, bạn sẽ có thể điều chỉnh bộ đệm của đường ống bằng cách sử dụng ulimit -pnhưng điều đó cứ phàn nàn về đối số không hợp lệ với tôi. Tôi cũng đã tìm thấy một bài đăng tuyên bố rằng bạn cần biên dịch lại kernel để thay đổi giới hạn này.


0

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.