grep '

2013-05-01 13 views
7

私はウェブサイトを立ち上げていますが、私はBash one-linerをセットアップしたいので、誰かがサイトにヒットしたら内部ブザーを使ってビープ音を鳴らしたいと思いました。grep '

これまでのところ、次のように動作しています。

tail -f access_log | while read x ; do echo -ne '\007' $x '\n' ; done 

テールは、これは以下のように動作します...

をaccess_logの後に続き、STDOUTにダンプ、一度にSTDOUTラインを取得し、「\ 007」「内部ビープ進コード」を持つ行をエコー、およびdone美しさ...すべてのヒットは、ログとビープ音からラインを示しています...しかし、それは非常に素早く迷惑をかけるので、whileにパイプされる前にtail -f /access/logをフィルタリングして、読み込み専用になるようにしてください。私は...来場者の良い指標となりgrep "/index.php"を考えていた

問題がある場所です...

私が行うことができます...すべて と私の

tail -f access_log | while read x ; do echo -ne '\007' $x '\n' ; done 

ビープ音...

tail -f access_log | grep "/index.php" 

を行うことができますし、ページが無いビープ音で示されているが、私は

を行うとき
tail -f access_log | grep "/index.php" | while read x ; do echo -ne '\007' $x '\n' ; done 

何も起こりません。ログからの行も、ビープ音もありません。

私はgrepがどこかでそれを台無しにしていると思うが、私はどこを見つけることができない。 私はそれが1つのライナーであることが大好きです、そして、それは実際にスクリプトで実行されるべきであり、より簡単になるはずですが、私がうまくいくはずの上記の理由は説明しません。

+0

? – Ding

+0

残念なことに...機密情報ではじまる...あなたはどんなaccess_logでも使うことができ、grepのために1つのURLだけを選ぶことができます。 –

+0

その素晴らしい機能ですが、1つのWebページからのビープ音(ビープ音の混合)は、約20〜30回のビープ音(ログ内の行)を生成することができます。ビープ音は、ファイルがどの時点で提供されているか... –

答えて

14

Grepの出力はパイプで使用するとバッファリングされます。 --line-bufferedを使用して強制的に回線バッファリングを使用し、回線をすぐに出力します。

tail -f access_log | grep --line-buffered "/index.php" | while read x ; do echo -ne '\007' $x '\n' ; done 

また、1つのawkコールにgrepwhileループを組み合わせることができます:あなたと周りの私たちが見て、混乱するためのいくつかのサンプルログコードを提供することができます

tail -f access_log | awk '/\/index.php/ { print "\007" $0 }' 
+0

あなたを愛してください...魅力のように働いています:) –

+1

今あなたの誇示しています... ... awkには入らなかったけど、面倒なことがたくさんありました。たぶん、マンページに良い読書をしてもらいました。もう一度ありがとうございました.... –

7

標準出力がターミナルでない場合、Grepバッファが出力されます。 --line-bufferedスイッチをgrepに渡す必要があります。このスイッチを使用すると、行を書き込むたびに標準出力をフラッシュします。

+0

あなたを愛してください...魅力のように働いています:) –