我只想从我的邮件日志文件中获取以“ @ 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命令不涉及(取消)缓冲。
尝试
—
Sundeep
grep -oP '[^<]+(?=@xyz.nl)'
(以及您需要的其他grep选项)
上面的awk和grep选项都像灵符一样工作!
—
Forkbeard
awk -F'[><@]' '/@xyz.nl/ {print $2}'
...