У меня проблема с почтой. Мне нужно получить все сообщения между 2 людьми:
[email protected]
и [email protected]
.
:file
From: [email protected]
to: [email protected]
<body of the message1>
From: [email protected]
to: [email protected]
<body of the message1>
From: [email protected]
to: [email protected]
<body of the message1>
From: [email protected]
to: [email protected]
<body of the message1>
From: [email protected]
to: [email protected]
<body of the message1>
Я пробовал использовать следующее sed
:
sed -n "/From: [Ss]omebody1/,/From: /p" inputfile > test.txt
В результате я получил все письма от someone1 в test.txt
файл.
Вопрос: Какова должна быть структура, sed
чтобы получать письма только между somebody1 и person?
решение1
С sed
:
sed -n '/^From: [email protected]/{h;n;/^to: [email protected]/{H;g;p;:x;n;p;s/.//;tx}}' file
/^From: [email protected]/
: сначала найдитеFrom:
адрес электронной почтыh;
сохраните эту строку в отсеке для хранения.n;
загрузить следующую строку (to:
строку).
/^to: [email protected]/
: поискto:
адреса электронной почтыH;
добавьте эту строку в поле удержания.g;
скопировать область удержания в область шаблона.p;
распечатать шаблон пространства.:x;
установите метку под названиемx
.n;
загрузить следующую строку (тело письма)p;
распечатайте эту строку.s/.//
сделайте замену в этой строке (просто замените один символ)...tx
... чтоt
команда может проверить, была ли эта замена успешной (когда строка не пустая, как в конце тела письма). Если да, то перейти обратно к меткеx
и повторять, пока не появится пустая строка, если нет, то перейти к концу скрипта.
Выход:
From: [email protected]
to: [email protected]
<body of the message1>
From: [email protected]
to: [email protected]
<body of the message1>
решение2
С 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} \
При совпадении установите переменную-флаг на 1 и пропустите строку./to\: person1/
Если флаг равен 1, обновите его до 2, в противном случае сбросьте до 0./From/{flag=0}
При совпадении значение флага сбрасывается.{if (flag==2){print NR, $0}}
если флаг равен 2, он выведетномер строкии линия.
Измените значение, person1
чтобы получить другие соответствия.
Входной файл используется
From: [email protected]
to: [email protected]
<body of the message1>
From: [email protected]
to: [email protected]
<body of the message2>
From: [email protected]
to: [email protected]
<body of the message3>
From: [email protected]
to: [email protected]
<body of the message4>
From: [email protected]
to: [email protected]
<body of the message5>