こんにちは、TechscoreBlogのログ閲覧が日課になっている河野です。
ログをtailでリアルタイムに見ているときに、grep, awk, sedと組み合わせることがあります。ところが、特にオプションを指定しないと、各コマンドでバッファされてしまうので、ログの表示が遅延することがあります。単にアクセス状況を眺めているだけなら問題ありませんが、チューニングしてる時とか気になりますよね。
そんなわけで、今回はバッファさせない方法を紹介します。
grep : --line-buffered
grepでのオプションです。正確にはバッファさせないのではなくて、1行毎に出力するというオプションです。
1 |
tail -f logfile | grep --line-buffered -vE '\.(css|js|ico|png|gif|jpe?g)' |
awk : fflush
awkで、バッファを出力するという関数です。printの後にすぐ呼び出すようにすれば、余計なバッファを回避できるようです。
1 |
tail -f logfile | awk '{print $1, $4, $NF; fflush()}' |
sed : --unbuffered, -u
sedでバッファしないというオプションです。「ちょくちょく出力バッファーに掃出」とヘルプに書いてあります。
1 |
tail -f logfile | sed -u -r -e 's@"((GET)|(POST)) (.+) HTTP/..."@\4@' |
それぞれtailと組み合わせるだけだとあまり気にならないんですが、pipeで3つ以上組み合わせるとバッファしてる影響がけっこう出てきます。
無理矢理組み合わせると、こんな感じでしょうか。
1 2 3 4 |
tail -f logfile | \ grep --line-buffered -vE '\.(css|js|ico|png|gif|jpe?g)' | \ awk '{print $1, $4, $7, $NF;fflush()}' | \ sed -u 's/\[//' |
これでより良いログ監視がたぶんできますね!
Trackbacks
[...] には –unbuffered というオプションがあるらしい。 grep, awk, sed でバッファしない方法 [...]