kuyruk -f olay bip sesi nasıl


14

Bilgisayarımın her kuyruk olayında bir sistem sesi vermesini istiyorum

Aşağıdaki komutu aldım

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

bip sesi olan bir şeye boru döşemek gibi kolay bir yol var mı? sevmek

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

eğer öyleyse grep çıktısı hala gösterilecek mi?


debian ve varyantları için varsayılan
— repoda

Yanıtlar:


16

Sadece beepaşağıdaki gibi tanımlayın :

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

Ardından, komutunuzu kullanabilirsiniz:

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

1
üzgünüm ama bu çalışmıyor, bip sesi
— çıkarmıyor

4
Her ne kadar kuyruk -f'nin doğrudan çıktısı hemen olsa da, bir borudan geçer geçmez tamponlanır. Herhangi bir şeyi gözlemlemeden önce yeterli "nadir bir şey" beklemek zorundasınız.
— mouviciel

Çıktıyı sedbir regexp ile veya benzeri (kuyruk ve grep arasında) something rarebirçok kez onunla değiştirebilirsiniz . Kaç kez yapılması gerektiği, borunun ne kadar tamponlandığına bağlıdır.
— David Spillett

6
@David - Bu bir vur ve kaç yaklaşım. Bir kanaldan geçirilen verilerin arabelleğini kaldırmak istiyorsanız, şu cevaplarda açıklanan yöntemlerden birini kullanın: stackoverflow.com/questions/1000674/turn-off-buffering-in-pipe

2
@ Nagul'un önerisinden hareketle, işte benim için çalışan çağrı:tail -f development.log | stdbuf -oL -eL grep "something rare" | beep
— GuitarPicker

10

GNU ekranı , belirli bir pencere değiştiğinde bip sesi çıkaracak yerleşik bir özelliğe sahiptir: kılavuz sayfasının ilgili bölümüne bakın .

Başlık özeti:

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

Yorumlarda belirtildiği gibi, bu sadece "nadir" bir şeyle eşleşenler değil , her yeni günlük girişinde bip sesi çıkarır, bu OP'nin istediği şeyi yapmaz. IMHO'yu tanımak için hala yararlı bir numara.

İki screenpencere açarak her iki dünyanın da en iyisini elde edebilirsiniz ( <C-a> cbir pencere açmak, <C-a> <C-a>iki pencere arasında geçiş yapmak için):

  1. ile izlendi tail -f yourfile.log | grep 'something rare'
  2. izlenmemiş, düz tail -f yourfile.log

Sonra pencere 2'de günlük kaydırma izleyerek oturup, "nadir bir şey" meydana geldiğinde 1. pencereden bip sesi alacaksınız.

screen awesomely çok yönlü - üzerinde okuma tavsiye ederim.


1
Bu sadece "nadir bir şey" için bip sesi çıkarmaz, değil mi?

1
O pencerede tail -f yourfile.log | grep something\ raretail -f logfile
— olanların

Hata! Sadece bip sesi istediğini fark etmedim something rare. Bunu yansıtacak şekilde düzenlendi. Grep işe yarayacaktı, ancak o zaman günlüğün geri kalanını, sadece nadir çizgileri görmeyecekti - anladığım kadarıyla, tüm günlüğü kaydırarak izlemek istiyor, ancak belirli olaylarda uyarılmak istiyor.
— Sam Stokes

1

Çıktının grep komutunda arabelleğe alınmasını durdurabilirsiniz. Ayrıntılar için man grep'e bakınız.

Grep çıkışını bip sesi çıkarabilirsiniz.

Aşağıdaki örnek insan bip sesinden ...

   As part of a log-watching pipeline

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

Bu el kitaplarında çok iyi şeyler var. Keşke onları bulmak için onları okumak zorunda olmasaydık. ;-)


1

Watch komutunun --beep seçeneği vardır ve yoklama aralığını da ayarlayabilirsiniz, ancak 2 saniyelik standart iyi olmalıdır

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

1
Not, watchparametrenizi / komutunuzu her (aralık) bölümde çalıştırarak ve sonuçları bir önceki çalışmaya getirerek çalışır. Böylece kuyruk komutunun normal versiyonunu kullanmak yerine kullanmak tail -f
— istersiniz

Bu benim için işe yaramadı ( watch --beepbenim kuyruk / grep ekleme ve sarma rağmen , hala bir bip alamadım).
— machineghost

1

Sed-G'yi aşağıdaki gibi eklemek için sed kullanabilirsiniz:

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

veya grep kullanmadan sadece nadir hatlarda aşağıdaki gibi:

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

hangi diyor ki: Nadir bir şey meydana hatlarında, s yerini tutmaz ucunda tutturdu kontrol G ile aynı şeyler için her şey ve baskı (ama eşleşmeyen satırları yazdırmayın). Harika çalışıyor!


0

Hım, zor. Belki böyle bir şey yapabiliriz?

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

Veya senin durumunda

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

Yine de bazı tamponlama yapıyor gibi görünüyor. forDöngü tarafından bu arabelleği kapatmanın bir yolu olup olmadığına bakacağım .

Görünüşe göre, borunun tamponlamasını kullanarak ayarlayabilmelisiniz, ulimit -pancak bu bana Geçersiz argüman hakkında şikayet etmeye devam ediyor. Bu sınırı değiştirmek için çekirdeği yeniden derlemeniz gerektiğini iddia eden bir yazı da buldum.


0

Önceki bir işte, sadece komut-fu ile güvenilir bir izleyici alamadım, bu yüzden her anket_duration saniyede dosyayı inceleyen ve ilgili ifade için yeni satırları selamlayan aşağıdaki gibi bir sarıcı komut dosyası vardı .

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

Bu bir Unix makinesindeydi. Linux'ta, onun kullanarak daha iyi bir tane gidebilir Inotify filewatcher arayüzü. Bu paket ( Ubuntu'da inotify araçları ) varsa, değiştirin

sleep $poll_duration 

ile

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

Bu çağrı, dosya değiştirilene kadar engeller. Engelleme sürümü, tail -farabellek arabelleğe alınmadan çalışacak şekilde yapılandırılabiliyorsa , sürümle alacağınız kadar etkilidir .

Not: Komut dosyası head --lines=$new_linecount, dosyayı kontrol ettikten sonra dosyaya eklenen satırların, bu döngüde kontrol edilen dosyanın yığınını çarpmadığından emin olmak için bir a yapar .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.