Sed / Awk сохранить текст между шаблонами, если содержит строку

446
wtk

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

The 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 

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

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

2

2 ответа на вопрос

1
chaos

С sed:

sed -n '/^From: somebody1@domain.com/}' 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> 
Вероятно, вы можете получить более чистый вывод без первого `p;`. Просто чтобы избежать списка изолированных совпадений с `From: somebody1 @ domain.com`, за которым не следует совпадение от второго лица и блок буквы. Hastur 9 лет назад 0
@Hastur Хороший совет, я исправил это, теперь он больше не печатает отдельные совпадения chaos 9 лет назад 0
Большое спасибо за это. Я хотел бы задать еще один вопрос: дело в том, что я должен получить взамен целое тело сообщения (которое может содержать символы новой строки) до следующего появления слова «От:». Сейчас я получаю больше информации, но этого недостаточно: пример вывода От: somebody1@domain.com Кому: person@domain.com Дата: Пн, 06 Июл 2015 17:41:03 GMT Тема: *************** Тип контента: ** ******************************* X-Scanned-By: ************* ********* и нет тела после него wtk 9 лет назад 0
Найдите в своем файле точку, в которой он останавливает ваш чанк, и _probbly_ вы в другой раз найдете ключевое слово `From: somebody1 @ domain.com` ... Вам нужно выбрать другой уникальный ключ, который вы больше не найдете в Тело вашего сообщения. То же самое будет и с ответом `awk`. Попробуйте тоже. Hastur 9 лет назад 0
0
Hastur

С awk:

awk '/From: [Ss]omebody1/ \ /to\: person1/ else } \ /From/ } ' input.txt  
  • /From: [Ss]omebody1/ \ Поместите переменную flag в 1 в совпадении и пропустите строку.
  • /to\: person1/ Если флаг равен 1, измените его на 2, в противном случае установите его на 0.
  • /From/ При совпадении сбрасывает значение флага.
  • }если флаг равен 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> 

Похожие вопросы