grep行缓冲有什么作用?


25

这是我在脚本中用于grep实时数据的命令。它似乎没有正确地提取实时数据,因为它丢失了一些行。

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

以下命令会做什么?什么是“行缓冲”?

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

Answers:


44

非交互使用时,大多数标准命令include都会grep缓冲输出,这意味着它不会立即将数据写入stdout。在写入之前,它会收集大量数据(取决于OS,在Linux中通常为4096字节)。

在您的命令中,grep的输出通过管道传递到stdinof sed命令,因此请grep缓冲其输出。

因此,该--line-buffered选项导致grep使用行缓冲区,这意味着每次看到换行符时都写入输出,而不是等待默认情况下达到4096字节。但是在这种情况下,您根本不需要grep,只需使用tail+ sed

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

通过没有修改缓冲区选项的命令,可以使用GNU coreutils stdbuf

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

打开行缓冲或使用-o0禁用缓冲。

注意

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.