将命令的输出通过管道传送到 grep,然后传送到另一个命令

将命令的输出通过管道传送到 grep,然后传送到另一个命令

我正在获取一个脚本的输出,然后将此输入传输到 grep 并将 grep 的输出传输到另一个脚本中:

./script1 | grep 'expr' | ./script2

但是,第二个脚本永远不会获得任何输入。同样,当我script2catscript1with替换时,不会打印任何内容ping

ping localhost | grep localhost | cat

如果我替换grepawk

ping localhost|awk '{print $1}'|cat

到底是怎么回事?

答案1

grep正在缓冲(因为它确定其输出不是终端;严格来说,这是 C 库的行为)。

要禁用此功能,请运行它unbuffer -p(从标准输入读取数据-p是必要的):unbuffer

ping localhost | unbuffer -p grep localhost | cat

或告诉grep按行缓冲(如果支持的话):

ping localhost | grep --line-buffered localhost | cat

相关内容