我正在尝试建立一个电子邮件列表。我想从电子邮件传入邮件目录 (vmail/..../cur) 获取电子邮件地址。我使用 dovecot,但我认为这没关系。有没有办法从包含约 30000 封电子邮件的 /cur 目录中获取所有发件人列表?
我努力了:
cat 1325153222.M840289P9721V0000000000000901I034001E2_2\,S\=2892\:2\, | grep 'From:' | awk '{ print $3 }'
输出:<[email protected]>
如果它能够在整个目录而不是仅在一个文件上运行,那就太好了。
答案1
评论太长了您的答案但你的策略有一些假设
find . -type f -exec cat {} + | grep 'From:' | awk '{ print $3 }'
这是我接下来想谈的。
标题 From:
通常采用以下形式
From: Sender Name or Description <[email protected]>
在哪里最后的(并不一定是第三) 字段是括在 中的电子邮件地址< >
。这意味着| awk '{ print $3 }'
可能并不总是打印电子邮件地址。awk
中的 NF 参数包含字段数,通过使用 , | awk '{ print $NF }'
您将始终让 awk 打印一行上的最后一个字段/列。
关于子命令grep 'From:'
:
我建议只匹配以下行的第一次出现开始使用From:
正则表达式,因为这将是标题行,并且字符串“From:”的任何其他出现可能来自邮件正文。您也可以在第一次匹配后使用 停止-m
,这对于大型邮件来说会更快一些。所以尝试grep -m 1 -e "^From:\ "
从样式的角度来看,您可以随时替换 cat FILENAME | grep STRING
,grep STRING FILENAME
并简单地使用-r
grep 中的开关来递归解析 Maildir 中的所有文件。
grep -r -e "^From:\ " -m 1 . |awk '{print $NF}'
答案2
find . -type f -exec cat {} + | grep 'From:' | awk '{ print $3 }'
效果很好