PCですべてのテールイベントでシステムビープ音を鳴らしたい
私は次のコマンドを持っています
tail -f development.log | grep "something rare"
ビープ音を鳴らすような簡単な方法はありますか?お気に入り
tail -f development.log | grep "something rare" | beep
その場合、grep出力は引き続き表示されますか?
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
sed
正規表現を使って出力をsomething rare
それ自体に置き換えたり(tailとgrepの間)、何度も置き換えたりすることができます。何回行う必要があるかは、パイプがバッファリングされる量に依存します。
tail -f development.log | stdbuf -oL -eL grep "something rare" | beep
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つのウィンドウを切り替える)ことで、両方の長所を最大限に活用できます。
tail -f yourfile.log | grep 'something rare'
tail -f yourfile.log
その後、ウィンドウ2のログスクロールを見ながら座って、「何か珍しい」ことが発生するとウィンドウ1からビープ音が鳴ります。
screen
驚くほど多用途です-それを読むことを強くお勧めします。
tail -f yourfile.log | grep something\ rare
なくtail -f logfile
something rare
。これを反映するように編集されました。grepは機能しますが、その後、ログの残りの部分は表示されず、まれな行のみが表示されます。
watchコマンドには--beepオプションがあり、ポーリング間隔も設定できますが、2秒の標準は大丈夫です
watch --beep 'tail development.log | grep "something rare"'
watch
すべての(間隔)セクションでパラメーター/コマンドを実行し、結果を前回の実行に戻すことで機能します。したがって、使用する代わりに、tailコマンドの通常バージョンを使用する必要がありますtail -f
watch --beep
私にはうまくいきませんでした(tail / grepを追加してラップしても、ビープ音は鳴りませんでした)。
うーん、トリッキー。おそらくこのようなことができるでしょうか?
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インターフェースを使用することで、さらに改善できます。このパッケージ(Ubuntuのinotify-tools)が存在する場合は、置き換えます
sleep $poll_duration
と
inotifywait -e modify "$file" 1>/dev/null 2>&1
この呼び出しは、ファイルが変更されるまでブロックします。パイプをバッファリングせずに動作するように構成できる場合、ブロッキングバージョンは、tail -f
バージョンで得られるものとほぼ同じくらい効率的です。
注:スクリプトはまずhead --lines=$new_linecount
、ファイルをチェックした後にファイルに追加された行が、このループでチェックされるファイルのチャンクを歪めないようにするためにa を実行します。