正如Barmar在评论中提到的那样,这个问题被吞没在一个4KB stdio缓冲区中。您可以使用unbuffer -p
来避免这种情况:
while sleep 0.3; do echo "1"; done | unbuffer -p tail -n +3 | grep 1
或者你也可以在行缓冲模式下使用stdbuf
:
while sleep 0.3; do echo "1"; done | stdbuf -oL tail -n +3 | grep 1
awk
)来避免由tail
到grep
的管道引起的问题。请注意保留HTML标签。while sleep 0.3; do echo "1"; done | awk 'NR > 2 && /1/'
当然,如果您需要将awk
的输出导入其他地方,那么您将面临同样的问题。但是,如果您的awk
版本支持它,您可以明确地刷新输出:
while sleep 0.3; do echo "1"; done | awk 'NR > 2 && /1/ {print $0; fflush()}' | | while read x; do echo "read '$x'"; done
...或者使用unbuffer -p
或stdbuf -oL
在awk
上(参见@JeffBowman的答案),如果你有这些命令(我没有,所以我无法测试)。
while read ...
命令。尽管如此,这可能对其他人来说是一个有效的解决方案,谢谢! - Adrien Suauawk
中使用另一个管道使其工作。可能对你的情况仍然不相关,但对其他人可能有用。 - Gordon Davisson
tail
命令的输出被缓存。 - Barmargrep
的输出管道传送给需要立即查看它的内容时才有用。因为你没有将该输出进行管道传输,所以这里并不有用。 - Barmar