实时管道

实时管道

这更多的是一个概念上的问题,而不是当前的问题。

可以这样做吗:

tail -f <file> | grep "string" | sed 's/stuff//g' >> output.txt

我认为问题是它tail -f永远不会终止,因此它不会在命令中继续执行。我正在尝试实时读取和输出文件。如果这不起作用,我该怎么做?

答案1

大多数在 stdout 上输出数据的命令(包括grepsed,)在不输出到终端时会缓冲输出。也就是说,它们会等待收集大量输出(例如 4KiB)后再冲洗将块复制到文件或管道。这通常更有效。有些命令允许您覆盖这一点,例如 GNUgrep有一个--line-buffered选项,GNUsed有一个--unbuffered选项。对于没有办法覆盖缓冲的命令,您可以使用unbuffer或之类的工具stdbuf

不过在这种情况下,我会考虑使用 GNU awk,您可以自己控制 stdout 的刷新(使用 fflush 函数)。

tail -f file | gawk '/string/{ gsub(/stuff/, "") } { print; fflush() }' > output.txt

Bash常见问题 #9有关缓冲的更多信息。

相关内容