tail -fイベントでビープ音を鳴らす方法


14

PCですべてのテールイベントでシステムビープ音を鳴らしたい

私は次のコマンドを持っています

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

ビープ音を鳴らすような簡単な方法はありますか?お気に入り

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

その場合、grep出力は引き続き表示されますか?


Debianのためのデフォルトのレポであるだけビープ音をインストールapt-getをバリアントが、それは、配管この方法で作業をしないとビーププログラムがあります
ヤコブCosoroaba

回答:


16

beep次のように定義するだけです:

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

次に、コマンドを使用できます。

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

1
申し訳ありませんが、これは機能していません。ビープ音も何も出力しません
Jakob Cosoroaba

4
tail -fの直接出力は即時ですが、パイプを通過するとすぐにバッファリングされます。何かを観察する前に、十分な「珍しいもの」を待つ必要があります。
ムービシエル

sed正規表現を使って出力をsomething rareそれ自体に置き換えたり(tailとgrepの間)、何度も置き換えたりすることができます。何回行う必要があるかは、パイプがバッファリングされる量に依存します。
デヴィッドスピレット

6
@David-それは、行き当たりばったりのアプローチです。:あなたは、パイプ経由で渡されたデータをバッファー解除したい場合は、これらの答えに記載された方法のいずれかを使用stackoverflow.com/questions/1000674/turn-off-buffering-in-pipe

2
@nagulの提案から離れて、ここで私のために働いた呼び出しがあります:tail -f development.log | stdbuf -oL -eL grep "something rare" | beep
GuitarPicker

10

GNU画面には、特定のウィンドウが変更されたときにビープ音を鳴らす機能が組み込まれていますマニュアルページの関連セクションを参照してください

見出しの要約:

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

コメントで指摘されているように、これは「何か珍しい」ものに一致するものだけでなく、すべての新しいログエントリでビープ音を鳴らします。それでも私見を知るための便利なトリック。

2つのscreenウィンドウ<C-a> cを開く(ウィンドウを開く、<C-a> <C-a>2つのウィンドウを切り替える)ことで、両方の長所を最大限に活用できます。

  1. 監視対象 tail -f yourfile.log | grep 'something rare'
  2. 監視なし、プレーン付き tail -f yourfile.log

その後、ウィンドウ2のログスクロールを見ながら座って、「何か珍しい」ことが発生するとウィンドウ1からビープ音が鳴ります。

screen 驚くほど多用途です-それを読むことを強くお勧めします。


1
それは「何か珍しい」だけでビープ音を鳴らさないでしょうか?

1
その特定のウィンドウで起こっていたことがすべてではtail -f yourfile.log | grep something\ rareなくtail -f logfile
David Spillett

おっと、私は彼がビープ音だけを望んでいることに気がつきませんでしたsomething rare。これを反映するように編集されました。grepは機能しますが、その後、ログの残りの部分は表示されず、まれな行のみが表示されます。
サムストークス

1

grepコマンドで出力のバッファリングを停止できます。詳細については、man grepを参照してください。

grep出力をビープ音にパイプできます。

次の例は、ビープ音...

   As part of a log-watching pipeline

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

これらのマニュアルには多くの良いものがあります。それを見つけるためにそれらを読む必要がなかった場合のみ。;-)


1

watchコマンドには--beepオプションがあり、ポーリング間隔も設定できますが、2秒の標準は大丈夫です

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

1
注意、watchすべての(間隔)セクションでパラメーター/コマンドを実行し、結果を前回の実行に戻すことで機能します。したがって、使用する代わりに、tailコマンドの通常バージョンを使用する必要がありますtail -f
RyanWilcox

これはwatch --beep私にはうまくいきませんでした(tail / grepを追加してラップしても、ビープ音は鳴りませんでした)。
マシンゴースト

1

次のように、sedを使用してcontrol-Gを追加できます。

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

または、次のようにgrepを使用せずに、まれな行でのみ:

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

これは言う:珍しい何かが起こるの行に、 ubstitute端にタック制御-Gと同じもののためにすべて、および印刷(ただし、一致しない行を出力しません)。よく働く!


0

うーん、トリッキー。おそらくこのようなことができるでしょうか?

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

またはあなたの場合

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

しかし、いくつかのバッファリングを行っているようです。forループによってこのバッファリングをオフにする方法があるかどうかを確認します。

どうやら、使用してパイプのバッファリングを調整することができるはずですulimit -pが、それは私に無効な引数について文句を言い続けています。また、この制限を変更するにはカーネルを再コンパイルする必要があると主張する投稿を見つけました。


0

前の仕事では、command-fuだけでは信頼できるウォッチャーを得ることができなかったため、poll_duration秒ごとにファイルを検査し、興味のあるフレーズの新しい行をgrepする次のようなラッパースクリプトがありました。

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

これはUnixマシン上にありました。Linuxでは、inotify filewatcherインターフェースを使用することで、さらに改善できます。このパッケージ(Ubuntuのinotify-tools)が存在する場合は、置き換えます

sleep $poll_duration 

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

この呼び出しは、ファイルが変更されるまでブロックします。パイプをバッファリングせずに動作するように構成できる場合、ブロッキングバージョンは、tail -fバージョンで得られるものとほぼ同じくらい効率的です。

注:スクリプトはまずhead --lines=$new_linecount、ファイルをチェックした後にファイルに追加された行が、このループでチェックされるファイルのチャンクを歪めないようにするためにa を実行します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.