【问题标题】:Linux bash: grep from stream and write to file [duplicate]Linux bash:从流中grep并写入文件[重复]
【发布时间】:2016-12-18 03:20:08
【问题描述】:

我有一个不断更新的日志文件 A(但它会滚动),我需要不断过滤它的内容并写入持久文件。

TL;DR 我需要:

tail -f A.log | grep "keyword" >> B.log

但此命令不会向B.log 写入任何内容。

研究只给了我复杂的东西,这不是我的情况。我的猜测是我遗漏了一些简单的概念。

这与标记为possible duplicate 的问题不同,因为 grep 有效,如果我不尝试将其写入文件,我就会得到它的输出。问题出在文件上。

【问题讨论】:

  • 简单的概念叫做“缓冲”。
  • @Thor 不。 “grep”工作得很好。写入文件不会。
  • @WebertS.Lima 如果包含--line-buffered,则输出到文件将起作用
  • @Leon 哦,你是对的。将其发布为答案,我会接受。
  • @WebertS.Lima 对相关问题 +1 的答案投赞成票

标签: linux bash grep pipe tail


【解决方案1】:

如果只是grep,没有写入文件,工作,你遇到了一个缓冲“问题”。 I/O 缓冲,除非由程序手动实现,否则将由 libc 处理。如果程序的标准输出是一个终端,缓冲将是基于行的。如果没有,libc 会缓冲输出,直到缓冲区达到大小限制。

在 Linux 上,意味着使用 glibc,您可以使用 stdbuf 命令来配置缓冲:

tail -f A.log | stdbuf -oL grep "keyword" >> B.log

-oL 指定输出流应该是行缓冲的。

【讨论】:

  • 这也有效。谢谢。
  • @WebertS.Lima --line-buffered 特定于 grep,stdbuf 可用于任何与 glibc 链接并将缓冲留给 libc 的程序。
  • 注意! =) 我会记住这一点的。
  • @WebertS.Lima 呃,我需要纠正我。由于--line-buffered 不兼容 POSIX,因此它也不能移植。在那种情况下stdbuf 就好了。
  • 我明白了。非常感谢您的关心。
猜你喜欢
  • 2015-01-15
  • 2016-12-10
  • 1970-01-01
  • 2012-04-02
  • 1970-01-01
  • 1970-01-01
  • 2015-11-26
  • 1970-01-01
  • 2020-03-24
相关资源
最近更新 更多