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

use*_*976 6 shell grep pipe

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

./script1 | grep 'expr' | ./script2
Run Code Online (Sandbox Code Playgroud)

但是,第二个脚本永远不会得到任何输入。同样,没有被印刷时,我代替script2catscript1ping

ping localhost | grep localhost | cat
Run Code Online (Sandbox Code Playgroud)

如果我替换grepawk

ping localhost|awk '{print $1}'|cat
Run Code Online (Sandbox Code Playgroud)

到底是怎么回事?

Ste*_*itt 8

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

要禁用它,请运行它unbuffer -p(从其标准输入中读取-p是必需的unbuffer):

ping localhost | unbuffer -p grep localhost | cat
Run Code Online (Sandbox Code Playgroud)

或者告诉grep按行缓冲(如果它支持这个):

ping localhost | grep --line-buffered localhost | cat
Run Code Online (Sandbox Code Playgroud)

  • TY 对 `--line-buffered` 标志表示友好,因为我无权在目标机器上安装 `unbuffer` (2认同)

归档时间:

查看次数:

23704 次

最近记录:

7 年,6 月 前