【问题标题】:parse an email message for sender name in bash在 bash 中解析发件人姓名的电子邮件
【发布时间】:2009-05-03 10:04:12
【问题描述】:

我在一个文件夹中有多个文件,每个文件都有一封电子邮件。每条消息都有一个格式的标题

主题:格式化字体
至:help@abc.com
发件人:发件人姓名

消息正文

我想从所有消息中获取所有唯一的发件人姓名(每个文件只有 1 条消息)。我该怎么做?

【问题讨论】:

    标签: bash unix


    【解决方案1】:

    假设消息中间不能有随机标题,那么这应该可以解决问题:

    cat * | grep '^From: ' | sort -u
    

    如果消息中间可能有其他误导性的“发件人:”行,那么您只需确保只从每条消息中获取第一个匹配行,如下所示:

    for f in * ; do cat $f | grep '^From: ' | head -1 | sort -u ; done
    

    显然,您可以将任一命令中的 * 替换为不同的 glob 或文件名列表。

    【讨论】:

    • 你是对的......我错过了原始问题的“独特”部分。我已更新我的答案以添加“|sort -u”。 ('|sort|uniq' 也可以)。
    • 纯学术:如果表头缺少From字段,但正文中存在对应行怎么办?
    【解决方案2】:

    您要过滤掉发件人姓名或电子邮件地址吗?通常你在“发件人”行中都有两个,例如

    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
    

    【讨论】:

      【解决方案3】:

      收紧一些答案。 (我还没有足够的声誉来发表评论。)以下应该就足够了:

      grep -m 1 '^From: ' * | sed -'s/^From: *//' | sort -u
      

      将为您提供目录中所有邮件的唯一发件人地址列表。如果要清理地址部分,可以向 sed 命令添加更多内容,例如 che 的答案。不需要'cat * | grep'。

      【讨论】:

        猜你喜欢
        • 2012-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-09
        • 1970-01-01
        • 2019-06-30
        • 2014-03-25
        相关资源
        最近更新 更多