查找包含文本的文件,但将其不同部分报告为结果

查找包含文本的文件,但将其不同部分报告为结果

我想查找 IMAP 文件夹中包含特定文本的所有电子邮件(即:发送到特定电子邮件地址的邮件)。我已经发现我可以通过使用 grep 来做到这一点,如下所示:

grep -rnw '~/users/example' -e "[email protected]"

这将返回匹配的文本或文件名(带有-l)。但我的任务真正需要的是知道找到的电子邮件文件的“标题”。

/home/example/users/example/.Archives.2013/cur/1364614080.4080.example.com:2,Sa
/home/example/users/example/.Archives.2013/cur/1385591317.91317.example.com:2,RSa
/home/example/users/example/.Archives.2013/cur/1358235054.35054.example.com:2,S
/home/example/users/example/.Archives.2013/cur/1358445545.45545.example.com:2,S
/home/example/users/example/.Archives.2013/cur/1453119248.M330746P8611.example.com,S=6761,W=6915:2,S

因此,我以某种方式需要根据上面的 grep 查找文件,但列出的结果应该是同一文件的不同部分(也许使用正则表达式?)。

我该怎么办?

答案1

使用formail(随 一起提供procmail):

find ~/users/example -type f -exec sh -c '
  for email do
    formail -x to -x cc < "$email" |
      grep -qF [email protected] &&
      formail -cx subject < "$email"
  done' sh {} +

也就是说,对于每个电子邮件文件

  • 提取ToCc标头
  • [email protected]在那里寻找
  • 如果找到,则提取Subject标题并将其打印在一行上(带有-c)。

答案2

文件的“标题”、路径或名称是什么?使用 --files-with-matches 选项或 -l 列出匹配的文件名。如果您仅搜索固定字符串而不是正则表达式,请使用 -F 加快该过程

grep -F -r -l [email protected] ~/users/example

要匹配文件的其他内容,grep 找到的文件列表(fgrep 与 grep -F 相同):

fgrep -rl [email protected] ~/users/example | xargs grep '^Subject:'

提示:许多命令在第一个参数处停止选项解析,而无需减号字符。所以所有选项都应该首先调用。

答案3

mutt

muff -f ~/users/example/.Archives.2013

(假设这是一个 maildir 文件夹)。在 中mutt,键入l(小写L)。

根据Limit to messages matching:提示输入:

~C [email protected]

(虽然严格来说,因为它是一个正则表达式,所以应该是~C 'my@example\.com'字面.匹配的)。

或者开始mutt为:

mutt -f ~/users/example/.Archives.2013 -e 'push "l ~C [email protected]"'

~CTo:在和标题中搜索Cc:

查看手册对于搜索语法。

要同时搜索多个邮箱,您可以使用多个邮件索引器(内部mutt或外部)。看https://dev.mutt.org/trac/wiki/UseCases/SearchingMail例如。

相关内容