linux - Sed 对流数据的操作

标签 linux bash shell

需要对流数据进行sed操作

tail -f sourcefile | sed -n 's/text1/text2/p' >~/destinationfile

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

最佳答案

两个程序都与 libc 链接,并且 libc 对输入/输出操作执行内部缓冲。当 stdout(!) 是终端时,缓冲将基于行;而当 stdout 是管道时,缓冲将基于 block 。基于 block 的缓冲使用更大的缓冲区,并且使用应用程序必须等待,直到缓冲区被填满,或者到达流的末尾,或者程序在文件描述符上调用flush()。但是,tailsed 都没有调用 flush()(使用默认命令行选项)。

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

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

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

stdbuf -i0 tail -f /var/log/syslog | sed -n 's/CRON/cron/p'

如果您要通过管道传输到文件,那么现在也需要禁用 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

关于linux - Sed 对流数据的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21419846/

相关文章:

linux - 删除几乎没有差异的重复行

Bash shell 如何将日期格式化为小写月份?

linux - 用于在 Octave 中的结构中导航字段的 GUI?

linux - 在 QNAP NAS 上安装 node.js 时显示 "flock: Command not found"

c# - 此站点无法提供来自 dotnet linux 的安全连接 asp.net core

linux - 如何将 ksh -x 的输出重定向到 unix 中的文件

python - 用于在文件夹中查找文件的 Bash 脚本

regex - grep 在 OSX 上的工作方式是否不同

linux - 使用 AWK 查找排除某些行的列的平均值

shell - 旋转文本文件