Как напечатать соответствующую строку, 3 строки после и соответствующий URL - PullRequest
0 голосов
/ 13 октября 2019

Я пытаюсь извлечь информацию из SMTP-писем в текстовом виде, например:

  1. дата (например: ср., 9 октября 2019 г. 01:55:58 -0700 (PDT)
  2. отправитель (например, с сайта xxx.yyy.com (zzz: com. [111.222.333.444])
  3. 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, но, как я хочу учиться, я предпочитаю один или оба из них:)

1 Ответ

0 голосов
/ 13 октября 2019

Хорошо, следующий длинный сценарий sed с комментариями внутри:

sed -nE '
/Received: from /{
    # hold mu line!
    h

    # ach, spagetti code, here we go again
    : notdate
    ${
        s/.*/ERROR: INVALID INPUT: DATE NOT FOUND/
        p
        q1
    }
    # the next line after the line ending with ; should be the date
    /;$/!{
        # so search for a line ending with ;
        n
        b notdate
    }
    # the next line is the date
    n
    # remove leading spaces
    s/^[[:space:]]*//
    # grab the Received: from line
    G
    # and save it for later
    h
}

# headers end with an empty line
/^$/{
    # loop over lines
    : read_next_line
    n

    # flag with \x01<URL>\x02 all occurences of URLs
    s/"(http[^"]+)"/\x01\1\x02/g

    # we found at least one URL if there is \x01 in the pattern space
    /\x01/{

        # extract each occurence to the end of pattern  space with a newline
        : again
        s/^([^\x01]*)\x01([^\x02]*)\x02(.*)$/\1\3\n\2/
            t again

        # remove everything in front of separator - the unparsed part of line
        s/^[^\n]*\n//
        # add URLs to hold space
        H
    }

    # if this is the last line, we should finally print something!, and, exit
    ${
        # grab the hold space
        x
        # replace the separator for a ;
        s/\n/;/g
        # print and exit successfully
        p
        q 0
    }

    # here we go again!
    b read_next_line
}

'

для следующего ввода:

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
SOMEHTML src="http://URL3" SOMEHTML src="http://URL4"

вывод:

Wed, 09 Oct 2019 01:55:58 -0700 (PDT);Received: from SOME.URL.COM (SOME.OTHER.URL.COM. [X.X.X.X]);http://URL1;http://URL2;http://URL3;http://URL4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...