对流数据的 sed 操作

kri*_*433 2 linux bash shell

需要sed对流数据进行操作

tail -f sourcefile | sed -n 's/text1/text2/p' >~/destinationfile
Run Code Online (Sandbox Code Playgroud)

我尝试了上面的命令,但无法让它工作。

hek*_*mgl 5

这两个程序都与 libc 相关联,并且 libc 对输入/输出操作执行内部缓冲。当 stdout(!) 是终端时缓冲将基于行,而当 stdout 是管道时缓冲将基于块。基于块的缓冲使用更大的缓冲区,并且消费应用程序必须等到缓冲区被填满,或者到达流的末尾或程序调用flush()文件描述符。但是既不调用tail也不sed调用flush()(使用默认命令行选项)。

在您的情况下,您可以看到基于块的尾部标准输入缓冲有效。发生这种情况是因为 stdout 进入管道到尾。

解决方案:您可以发出stdbuf命令禁用tail的输入缓冲:

如果您只想在终端中查看 sed 的输出:

stdbuf -i0 tail -f /var/log/syslog | sed -n 's/CRON/cron/p'
Run Code Online (Sandbox Code Playgroud)

如果您正在通过管道传输到文件 sed 的输出缓冲区,现在也需要禁用!

touch output.txt
tail -f output.txt & # tail output in background in order to see
                     # file changes immediately

stdbuf -i0 tail -f /var/log/syslog | stdbuf -o0 sed -n 's/CRON/cron/p' > output.txt
Run Code Online (Sandbox Code Playgroud)