2

У меня проблема с почтой. Мне нужно получить все сообщения между двумя людьми:somebody1@domain.com и person@domain.com .

file:

From: somebody1@domain.com
to: person@domain.com
<body of the message1>

From: somebody2@domain.com
to: person@domain.com
<body of the message1>

From: somebody1@domain.com
to: person@domain.com
<body of the message1>

From: somebody3@domain.com
to: person@domain.com
<body of the message1>

From: somebody5@domain.com
to: person@domain.com
<body of the message1>

Я попытался использовать следующий sed:

sed -n "/From: [Ss]omebody1/,/From: /p" inputfile > test.txt

В результате я получил все письма от somebody1 к файлу test.txt .

Вопрос: какой должна быть структура sed чтобы получать только письма между кем-то1 и человеком?

2 ответа2

1

С помощью sed:

sed -n '/^From: somebody1@domain.com/{h;n;/^to: person@domain.com/{H;g;p;:x;n;p;s/.//;tx}}' file

  • /^From: somebody1@domain.com/: сначала найдите адрес From: адрес электронной почты
    • h; сохранить эту строку в пространстве удержания.
    • n; загрузить следующую строку (строка to::).
  • /^to: person@domain.com/: поиск to: адрес электронной почты
    • H; добавить эту строку в область удержания.
    • g; скопируйте пространство удержания в пространство шаблона.
    • p; напечатайте образец пространства.
    • :x; установить метку с именем x .
    • n; загрузить следующую строку (тело письма)
    • p; напечатайте эту строку.
    • s/.// сделать замену в этой строке (просто заменить один символ)...
    • tx ... что команда t может проверить успешность этой замены (когда строка не пустая, как в конце тела письма). Если да, вернитесь к метке x и повторяйте, пока не появится пустая строка, если нет, переходите к концу сценария.

Выход:

From: somebody1@domain.com
to: person@domain.com
<body of the message1>

From: somebody1@domain.com
to: person@domain.com
<body of the message1>
0

С awk:

awk '/From: [Ss]omebody1/{flag=1;next} \
  /to\: person1/ {if (flag>0) {flag=2; print; next} else {flag=0; next}} \
 /From/{flag=0} {if (flag==2){print NR,flag, $0}} ' input.txt 
  • /From: [Ss]omebody1/{flag=1;next} \ Поместите переменную flag в 1 при совпадении и пропустите строку.
  • /to\: person1/ Если флаг равен 1, измените его на 2, в противном случае установите его на 0.
  • /From/{flag=0} При совпадении сбрасывается значение флага.
  • {if (flag==2){print NR, $0}} если flag равен 2, он напечатает номер белья и строку.

Измените значение person1 чтобы иметь разные совпадения.

Используется входной файл

From: somebody1@domain.com
to: person2@domain.com
<body of the message1>

From: somebody2@domain.com
to: person1@domain.com
<body of the message2>

From: somebody1@domain.com
to: person1@domain.com
<body of the message3>

From: somebody1@domain.com
to: person1@domain.com
<body of the message4>

From: somebody3@domain.com
to: person@domain.com
<body of the message5>

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .