cara berbunyi bip pada acara tail -f

14

Saya ingin PC saya membuat bip sistem pada setiap acara ekor

Saya memiliki perintah berikut

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

apakah ada cara mudah seperti menyalurkannya ke sesuatu yang berbunyi bip? Suka

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

jika demikian apakah output grep akan tetap ditampilkan?

Jakob Cosoroaba
sumber
ada program bip dengan berada di repo default untuk debian dan varian hanya apt-get install beep tapi tidak bekerja dengan cara perpipaan ini
Jakob Cosoroaba

Jawaban:

16

Cukup tentukan beepsebagai berikut:

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

Kemudian, Anda dapat menggunakan perintah Anda:

tail -f development.log | grep "something rare" | beep
mouviciel
sumber
1
maaf tapi ini tidak berfungsi, tidak berbunyi bip atau mencetak apa pun
Jakob Cosoroaba
4
Meskipun keluaran langsung dari tail -f adalah langsung, ia akan disangga segera setelah melewati pipa. Anda harus menunggu cukup "sesuatu yang langka" sebelum mengamati apa pun.
mouviciel
Anda bisa melewatkan output melalui sedatau serupa (antara ekor dan grep) dengan regexp ganti something raredengan itu sendiri berkali-kali. Berapa kali perlu dilakukan tergantung pada seberapa banyak pipa disangga.
David Spillett
6
@ David - Itu adalah pendekatan hit-and-miss. Jika Anda ingin menghapus data yang diteruskan melalui pipa, gunakan salah satu metode yang dijelaskan dalam jawaban ini: stackoverflow.com/questions/1000674/turn-off-buffering-in-pipe
2
Berangkat dari saran @ nagul, di sini adalah doa yang bekerja untuk saya:tail -f development.log | stdbuf -oL -eL grep "something rare" | beep
GuitarPicker
10

Layar GNU memiliki fitur bawaan untuk berbunyi bip ketika jendela yang diberikan berubah: lihat bagian yang relevan dari halaman manual .

Ringkasan judul:

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

Seperti yang ditunjukkan dalam komentar, ini akan berbunyi bip pada setiap entri log baru, bukan hanya entri yang cocok dengan "sesuatu yang langka", jadi ini tidak cukup sesuai dengan yang diminta OP. Masih trik yang berguna untuk mengetahui IMHO.

Anda bisa mendapatkan yang terbaik dari kedua dunia dengan membuka dua screenjendela ( <C-a> cuntuk membuka jendela, <C-a> <C-a>untuk beralih di antara dua jendela):

  1. dipantau, dengan tail -f yourfile.log | grep 'something rare'
  2. tidak diawasi, dengan sebuah dataran tail -f yourfile.log

Kemudian Anda bisa duduk menonton gulir log melewati di jendela 2, dan Anda akan mendapat bunyi bip dari jendela 1 ketika "sesuatu yang langka" terjadi.

screen sangat serbaguna - Saya sangat merekomendasikan membaca di atasnya.

Sam Stokes
sumber
1
Itu tidak akan berbunyi bip hanya pada "sesuatu yang langka", bukan?
1
Itu akan terjadi jika semua yang terjadi di jendela tertentu itu tail -f yourfile.log | grep something\ rarebukan hanyatail -f logfile
David Spillett
Ups, saya tidak memperhatikan bahwa dia hanya ingin berbunyi bip something rare. Diedit untuk mencerminkan ini. Grep akan bekerja, tetapi kemudian dia tidak akan melihat sisa log, hanya garis langka - seperti yang saya mengerti dia ingin dapat menonton seluruh log bergulir, tetapi waspada pada peristiwa tertentu.
Sam Stokes
1

Anda dapat menghentikan output agar tidak buffered di perintah grep. Lihat man grep untuk detailnya.

Anda dapat menyalurkan output grep ke bip.

Contoh berikut ini dari ...

   As part of a log-watching pipeline

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

Ada banyak hal bagus dalam manual itu. Kalau saja kita tidak perlu membacanya untuk menemukannya. ;-)

Seorang pembaca
sumber
1

Perintah arloji memiliki opsi --beep, dan Anda dapat mengatur interval polling juga, tetapi standar dengan 2 detik harus ok

watch --beep 'tail development.log | grep "something rare"'
oanoss
sumber
1
Catatan, watchbekerja dengan menjalankan parameter / perintah Anda setiap bagian (interval) kemudian datang hasilnya ke jalankan sebelumnya. Dengan demikian Anda akan ingin menggunakan versi normal dari perintah tail, alih-alih menggunakantail -f
RyanWilcox
Ini tidak berhasil untuk saya (meskipun menambah watch --beepdan membungkus ekor / grep saya, saya masih tidak mendapat bunyi bip).
machineghost
1

Anda bisa menggunakan sed untuk menambahkan control-G sebagai berikut:

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

atau hanya pada garis langka, tanpa menggunakan grep, sebagai berikut:

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

yang mengatakan: di garis mana sesuatu yang langka terjadi, s ubstitute segalanya untuk hal-hal yang sama dengan kontrol-G tertempel di akhir, dan cetak (tapi tidak mencetak garis non-matching). Bagus sekali!

Mi5ke
sumber
0

Hm, gampang-gampang susah. Kita mungkin bisa melakukan sesuatu seperti ini?

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

Atau dalam kasus Anda

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

Tampaknya akan melakukan beberapa buffering. Saya akan melihat apakah ada cara untuk mematikan buffering ini oleh forloop.

Rupanya, Anda harus dapat menyesuaikan buffering pipa dengan menggunakan ulimit -ptetapi itu terus mengeluh tentang argumen tidak valid kepada saya. Saya juga menemukan posting yang mengklaim Anda perlu mengkompilasi ulang kernel untuk mengubah batas ini.

Ivan Vučica
sumber
0

Dalam pekerjaan sebelumnya, saya tidak bisa mendapatkan pengamat yang dapat diandalkan hanya dengan command-fu, jadi saya punya skrip pembungkus seperti yang di bawah ini, yang memeriksa file setiap poll_duration detik dan mengambil baris baru untuk frasa yang tertarik.

#!/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

Ini pada mesin Unix. Pada Linux, Anda dapat pergi satu lebih baik dengan menggunakan nya inotify antarmuka filewatcher. Jika paket ini ( inotify-tools pada Ubuntu) hadir, ganti

sleep $poll_duration 

dengan

inotifywait -e modify "$file"  1>/dev/null 2>&1

Panggilan ini memblokir hingga file diubah. Versi pemblokiran hampir seefisien apa yang Anda dapatkan dengan tail -fversi tersebut jika pipa dapat dikonfigurasi agar berfungsi tanpa buffering.

Catatan: Skrip terlebih dahulu melakukan a head --lines=$new_linecountuntuk memastikan bahwa baris yang ditambahkan ke file setelah kami memeriksanya tidak memiringkan potongan file yang diperiksa dalam loop ini.


sumber