这更多的是一个概念上的问题,而不是当前的问题。
可以这样做吗:
tail -f <file> | grep "string" | sed 's/stuff//g' >> output.txt
我认为问题是它tail -f
永远不会终止,因此它不会在命令中继续执行。我正在尝试实时读取和输出文件。如果这不起作用,我该怎么做?
答案1
大多数在 stdout 上输出数据的命令(包括grep
和sed
,)在不输出到终端时会缓冲输出。也就是说,它们会等待收集大量输出(例如 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有关缓冲的更多信息。