ログの監視やなんやらで、tail -Fなどと組み合わせて使用する機会の多いsedやawk、grepだが、デフォルトの動作ではバッファリングされてしまう。 これをバッファしないように実行する場合、以下のようにコマンドを実行する。
sedの場合
GNU拡張されているsedの場合、-u
オプションというオプションがあるので、それを用いる。
sed -u '~'
sed --unbuffered '~'
注意したいのが、Mac OS XのsedコマンドなどGNU拡張でないsedの場合、-uオプションが無い。
この場合は、後述するstdbuf
を用いるか、(どっちにしろcoreutils入れるので)gsedを用いるといいだろう。
awkの場合
awkの場合、print直後にfflush()関数を呼び出すことでバッファリングを回避できる。
awk '{print $0;fflush()}'
grepの場合
grepの場合、「--line-buffered
」オプションを付与することで、バッファリングを回避できる。
OS Xのgrepコマンドでも使用可能。
grep --line-buffered
perlの場合
perlのワンライナーでバッファリングを回避する場合、以下のようにオートフラッシュを有効化(「$|=1;
」で有効化している)しておく。
perl -pe '$|=1;s/aaa/111/'
参考
stdbufコマンドを用いる
バッファリングを回避するオプションのないコマンドの場合、coreutilsのstdbufコマンドを利用するとバッファリングをさせずにコマンドを実行することができる。
stdbuf -i0 -o0 -e0 コマンド
scriptコマンドを用いる
もしくは、scriptコマンドを経由することで擬似端末越しにコマンドを実行させることで、バッファリングをさせないという方法も取れるようだ。
script -q /dev/null 継続実行コマンド | 出力コマンド # Mac OS Xなど
script -q -c "継続実行コマンド" /dev/null | 出力コマンド # Linux系