Я пытаюсь извлечь информацию из SMTP-писем в текстовом виде, например:
- дата (например: ср., 9 октября 2019 г. 01:55:58 -0700 (PDT)
- отправитель (например, с сайта xxx.yyy.com (zzz: com. [111.222.333.444])
- URL-адреса, присутствующие в почте (например: http://some.thing)
ВотПример ввода:
Delivered-To: SOME@ADDRESS.COM
Received: by X.X.X.X with SMTP id SOMEID;
Wed, 9 Oct 2019 01:55:58 -0700 (PDT)
X-Received: by X.X.X.X with SMTP id SOMEID;
Wed, 09 Oct 2019 01:55:58 -0700 (PDT)
Return-Path: <SOME@ADDRESS.COM>
Received: from SOME.URL.COM (SOME.OTHER.URL.COM. [X.X.X.X])
by SOME.THIRD.URL.COM with ESMTP id SOMEID
for <SOME@ADDRESS.COM>;
Wed, 09 Oct 2019 01:55:58 -0700 (PDT)
SOME_HTML
SOME_HTML
href="http://URL1"><img
SOME_HTML
src="http://URL2"
SOME_HTML
Пример намеренно урезан, потому что заголовок длиннее, но это для примера
Я пробовал sed и awk, и мне удалось сделатьчто-то, но не так, как я хочу.
SED:
sed -e 's/http/\nhttp/g' -n -e '/Received: from/{h;n;n;n;H;x;s/\n \+/;/;p}' a.txt
Первый - это иметь URL на одном удержании, но мне не удалось использоватьэто после. И в любом случае, это не в порядке.
AWK:
BEGIN{
RS = "\n";
FS = "";
}
/Received: from/{
from = $0;
getline;
getline;
getline;
date = $0
}
/"\"https?://[^\"]+"/
{
FS="\"";
print $0;
}
END{
print date";"from;
};
Этот работает за исключением URL. Rexgexp не работает, пока вoneline да. Я также попытался найти более элегантный способ для даты, используя значение NR + 3, но это не сработало.
И отобразить это в формате csv:
дата; отправитель; URL1; URL2; ...
Я работаюВы предпочитаете чистый sed или чистый awk, потому что я думаю, что могу сделать это с помощью grep, tail, sed и awk, но, как я хочу учиться, я предпочитаю один или оба из них:)