linux - 在 CLI 程序之间通过管道传输输出时出现缓冲问题

标签 linux perl sed grep command-line-interface

我正在尝试通过几个过滤器来追踪 apache 错误日志。

这非常有效:

tail -fn0 /var/log/apache2/error.log | egrep -v "PHP Notice|File does not exist"

但是输出中有一些文字“\n”,我想用实际的新行替换,所以我通过管道输入 perl:

tail -fn0 /var/log/apache2/error.log | egrep -v "PHP Notice|File does not exist" | perl -ne 's/\\n/\n/g; print"$_"'

这似乎有一些缓存问题(第一页命中没有产生任何结果,第二页命中并且出现了两份调试信息),它似乎也有点喜怒无常。

所以我尝试了 sed:

tail -fn0 /var/log/apache2/error.log | egrep -v "PHP Notice|File does not exist" | sed 's/\\n/\n/g'

似乎遇到了同样的问题。

最佳答案

正确,当您使用大多数程序来归档或通过管道传输时,它们会缓冲输出。在某些情况下您可以控制它:GNU grep 系列接受 --line-buffered 选项,专门用于像这样的管道。此外,在 Perl 中,您可以使用 $| = 1; 效果相同。 (据我所知,sed 没有任何此类选项。)

缓冲的是管道开头或中间的内容,而不是结尾(它正在与您的终端通信,因此它将被行缓冲)所以您想使用 egrep --line-buffered

关于linux - 在 CLI 程序之间通过管道传输输出时出现缓冲问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5503084/

相关文章:

perl - map perl 从值循环

regex - 我可以在 sed 中提到从不同模式到其他模式的反向引用吗

c - Linux内核模块的Makefile问题

php - 在 Php7 的当前设置上安装 php-pear 包

perl - websocket在漫长过程中的异步反馈

linux - 根据 Perl 目录中更新的时间戳获取目录

php - 通过 shell_exec 的 Sed 命令未执行

sed - 如何删除图案之间的线条,但保持与第二个图案的线条

php - PDO:如何在 Linux 上访问 Microsoft Access 文件?

c - TCP 使用多播仅用于初始化