【发布时间】:2009-05-03 10:04:12
【问题描述】:
我在一个文件夹中有多个文件,每个文件都有一封电子邮件。每条消息都有一个格式的标题
主题:格式化字体
至:help@abc.com
发件人:发件人姓名
消息正文
我想从所有消息中获取所有唯一的发件人姓名(每个文件只有 1 条消息)。我该怎么做?
【问题讨论】:
我在一个文件夹中有多个文件,每个文件都有一封电子邮件。每条消息都有一个格式的标题
主题:格式化字体
至:help@abc.com
发件人:发件人姓名
消息正文
我想从所有消息中获取所有唯一的发件人姓名(每个文件只有 1 条消息)。我该怎么做?
【问题讨论】:
假设消息中间不能有随机标题,那么这应该可以解决问题:
cat * | grep '^From: ' | sort -u
如果消息中间可能有其他误导性的“发件人:”行,那么您只需确保只从每条消息中获取第一个匹配行,如下所示:
for f in * ; do cat $f | grep '^From: ' | head -1 | sort -u ; done
显然,您可以将任一命令中的 * 替换为不同的 glob 或文件名列表。
【讨论】:
您要过滤掉发件人姓名或电子邮件地址吗?通常你在“发件人”行中都有两个,例如
From: Lessie <etxhakk@ericsson.se>
您可以使用sed 删除电子邮件地址部分
sed 's/^From: //;s/ *<[^>]*> *//'
以这样的方式结束:
ls | while read filename
do
grep '^From: ' $filename | head -n1 | sed 's/^From: //;s/ *<[^>]*> *//;s/^"//;s/"$//'
done | sort -u
【讨论】:
收紧一些答案。 (我还没有足够的声誉来发表评论。)以下应该就足够了:
grep -m 1 '^From: ' * | sed -'s/^From: *//' | sort -u
将为您提供目录中所有邮件的唯一发件人地址列表。如果要清理地址部分,可以向 sed 命令添加更多内容,例如 che 的答案。不需要'cat * | grep'。
【讨论】: