如何缓冲切割?


8

我只想从我的邮件日志文件中获取以“ @ 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=<someone@xyz.nl>, 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

然而,削减似乎也在缓冲。如果我使用cat而不是tail -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命令不涉及(取消)缓冲。


awk -F'[><@]' '/@xyz.nl/ {print $2}'...
jasonwryan's

1
尝试grep -oP '[^<]+(?=@xyz.nl)'(以及您需要的其他grep选项)
Sundeep

上面的awk和grep选项都像灵符一样工作!
Forkbeard

Answers:


16

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

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

-oL 使它缓冲行,这看起来像您想要的。


这正是我在寻找的东西,谢谢!
Forkbeard

由于某些原因,不会为我做任何更改。:(
panzi

1
@panzi随时问您自己的问题,并链接到此问题。请提供完整的详细信息(如果可能的话,您将运行确切的命令,操作系统,发行版和版本等)。希望有人能够弄清楚为什么它对您不起作用。
derobert
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.