如何取消缓冲剪切?

如何取消缓冲剪切?

我只想从我的邮件日志文件中获取以“@xyz.nl”结尾的电子邮件地址。为了实现这一目标,我这样做:

# tail -f /var/log/mail.log | grep --i --line-buffered "@xyz.nl" | cut -d '@' -f 1 | cut -d '<' -f 2

grep 的 --line-buffered 是必要的,因为否则它会缓冲其输出,因为管道不被视为终端。 Grep 将输出如下行:

Aug 29 11:56:01 localhost postfix/smtp[4124]: 05491500123: to=<[email protected]>, relay=123.456.123.456[123.456.123.456]:25, delay=2, delays=0.4/0/0.4/1.2, dsn=2.0.0, status=sent (250 2.0.0 u7T9twxN074009 Message accepted for delivery)

第一次切割会产生:

Aug 29 11:56:01 localhost postfix/smtp[4124]: 05491500123: to=<someone

第二次切割应生成:

someone

然而,削减似乎也在缓冲。如果我用以下命令启动命令代替尾部-f我从日志文件中获取所有相关结果(以首选格式)。但我需要实时日志文件的结果。

我尝试使用 unbuffer 来实现此目的:

# tail -f /var/log/mail.log | grep --i --line-buffered "@xyz.nl" | unbuffer cut -d '@' -f 1 | cut -d '<' -f 2

还尝试过:

# unbuffer tail -f /var/log/mail.log | grep --i --line-buffered "@xyz.nl" | unbuffer cut -d '@' -f 1 | cut -d '<' -f 2

...这应该从第一个中删除 4K 缓冲。然而,这不起作用。我知道它正在缓冲,因为如果我 grep 本地域,它会获得更多命中,缓冲区会更快填充,并且会更早生成输出(以 4K 批次)。

所以我的问题是:如何取消缓冲

相关:我知道 sed 和 (g)awk 可以将电子邮件地址传递给我。我一直在努力,但目前还没有任何结果。使用 sed 或 (g)awk 的答案是受欢迎的,并且可能会解决我的直接问题,但我仍然对如何取消缓冲 cut 命令的问题的名义答案感兴趣。 cut 命令不涉及(取消)缓冲。

答案1

如果您使用的是 GNU Coreutils 的系统(几乎所有 Linux),您可以尝试stdbuf

… | stdbuf -oL cut -d '@' -f 1 | …

-oL使其成为行缓冲,这似乎就是您想要的。

相关内容