【发布时间】:2019-10-14 03:52:36
【问题描述】:
我尝试从 SMTP 邮件中提取文本信息,即:
- 日期(例如:2019 年 10 月 9 日星期三 01:55:58 -0700 (PDT)
- 发件人(例如:来自 xxx.yyy.com (zzz:com. [111.222.333.444])
- 邮件中的网址(例如: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 在单行中不起作用是。 我还尝试通过使用 NR+3 的值来寻找更优雅的日期方式,但没有奏效。
并以 csv 格式显示:
日期;发件人;URL1;URL2;...
我更喜欢纯 sed 或纯 awk,因为我认为我可以使用 grep、tail、sed 和 awk 来完成,但我想学习,我更喜欢其中一个或两个 :)
【问题讨论】:
-
您提供的简短输入的输出是什么?我不知道该选择哪些网址?此外,最好使用 html/xml 感知工具解析 html,而不是使用 sed。
-
应该是
Wed, 9 Oct 2019 01:55:58 -0700 (PDT);Received: from SOME.URL.COM (SOME.OTHER.URL.COM. [X.X.X.X]);http://URL1;http://URL2 -
我们假设有 _only_(!) 一个
Received: from并且它的第四行总是有日期? (我问,因为 smpt 标头要复杂得多)。好吧,你有http://URL1><img并从中提取了http://URL1所以[^"]+将不起作用。或者输入中是否缺少"? -
对于 URL,我也不知道,但由于它在 HTML 中,一些典型的正则表达式应该像这样与 SED 一起工作,例如:
sed -rne 's#.+?(https?://[^"]+).*#\1#p' -
是的,我的代码就是以此为基础的(一个“Received; from”),如果我没记错的话,我发现了一个例子,日期在第二行,但我不是当然...但为简单起见,请考虑以下 3 行