PCでテールイベントごとにシステムビープ音を鳴らしたい
私は次のコマンドを持っています
tail -f development.log | grep "something rare"
ビープ音を鳴らすものにパイプで接続するような簡単な方法はありますか?お気に入り
tail -f development.log | grep "something rare" | beep
その場合、grep出力は引き続き表示されますか?
beep
を次のように定義するだけです。
beep() { read a || exit; printf "$a\007\n"; beep; }
次に、コマンドを使用できます。
tail -f development.log | grep "something rare" | beep
GNU screen は、特定のウィンドウが変更されたときにビープ音を鳴らす機能が組み込まれています。 manページの関連セクション を参照してください。
見出しの要約:
$ screen
$ tail -f yourfile.log # inside the screen session
<C-a> M # "Window 0 (bash) is now being monitored for all activity."
コメントで指摘されているように、これは「珍しいもの」に一致するものだけでなく、すべての新しいログエントリでビープ音を鳴らします。 OPが求めたもの。それでも私見を知るための便利なトリック。
2つのscreen
ウィンドウを開くと、両方の長所を活かすことができます(<C-a> c
ウィンドウを開くには、<C-a> <C-a>
2つのウィンドウを切り替える):
tail -f yourfile.log | grep 'something rare'
tail -f yourfile.log
次に、ウィンドウ2でログがスクロールするのを見て座って、「何か珍しい」ことが発生するとウィンドウ1からビープ音が鳴ります。
screen
は非常に用途が広いです-私はそれを読むことを強くお勧めします。
Grepコマンドで出力のバッファリングを停止できます。詳細については、mangrepを参照してください。
Grep出力をビープ音にパイプすることができます。
次の例は、ビープ音からのものです...
As part of a log-watching pipeline
tail -f /var/log/xferlog | grep --line-buffered passwd | \
beep -f 1000 -r 5 -s
それらのマニュアルにはたくさんの良いものがあります。それを見つけるためにそれらを読む必要がなければ。 ;-)
次のように、sedを使用してcontrol-Gを追加できます。
tail -f myFile | sed "s/.*/&\x07/"
または、次のように、grepを使用せずに、まれな行でのみ実行します。
tail -f myFile | sed -n "/something rare/s/.*/&\x07/p"
つまり、まれなことが発生する行では、s同じものの代わりにcontrol-Gを最後に付けて印刷します(ただし、一致しない行は印刷しないでください)。よく働く!
Watchコマンドには--beepオプションがあり、ポーリング間隔も設定できますが、2秒の標準で問題ありません。
watch --beep 'tail development.log | grep "something rare"'
うーん、トリッキー。私たちはおそらくこのようなことをすることができますか?
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
を使用してパイプのバッファリングを調整できるはずですが、それは私への無効な引数について不平を言い続けます。この制限を変更するには、カーネルを再コンパイルする必要があると主張する投稿も見つかりました。
以前の仕事では、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インターフェースを使用することで1つ上手くいくことができます。このパッケージ(Ubuntuではinotify-tools)が存在する場合は、
sleep $poll_duration
と
inotifywait -e modify "$file" 1>/dev/null 2>&1
この呼び出しは、ファイルが変更されるまでブロックされます。 ブロッキングバージョンは、パイプがバッファリングなしで機能するように構成できる場合、tail -f
バージョンで得られるものとほぼ同じくらい効率的です。
注:スクリプトは最初にhead --lines=$new_linecount
を実行して、チェック後にファイルに追加された行が、このループでチェックされるファイルのチャンクを歪めないようにします。