Найти файлы, содержащие текст, но выдать другую его часть в качестве результата

Найти файлы, содержащие текст, но выдать другую его часть в качестве результата

Я хочу найти все письма в моих папках 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 {} +

То есть, для каждого файла электронной почты

  • извлечь заголовки ToиCc
  • искать [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]"'

~Cпоиск в заголовках To:и Cc:.

Проверятьруководстводля синтаксиса поиска.

Для поиска в нескольких почтовых ящиках одновременно можно использовать несколько почтовых индексаторов (внутри muttили вне их). См.https://dev.mutt.org/trac/wiki/UseCases/SearchingMailнапример.

Связанный контент