ログの監視やなんやらで、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系

参考