Получить последние 10 минут почтового лога

Apr 18, 2017 17:11

Скриптик 10min:

#! /bin/bash

TIME=`date -d '-10minute' +%s`

while read line
do
time=`echo $line | cut -f 1,2,3 -d' ' `
time=`date -d "$time" +%s`
if [ $time -gt $TIME ]
then
echo $line
fi
done
Работает безумно медленно. Но работает ( Read more... )

script, parsing, awk, log, bash, time

Leave a comment

what_me April 19 2017, 08:24:39 UTC
другая версия 10min

#!/usr/bin/env perl -ln
use Time::Piece;

INIT {
$pattern = '%b %d %T';
$start_time = Time::Piece->strptime(localtime->strftime($pattern), $pattern) - 600;
}

print if $start_time < Time::Piece->strptime(substr($_,0,15), $pattern);

Reply

linux007 April 19 2017, 08:28:35 UTC
Красиво (и в смысле цветов, и в смысле кода).

Вопрос, будет ли он работать быстрее, чем bash?

Reply

linux007 April 19 2017, 08:31:24 UTC
Error parsing time at /usr/lib/i386-linux-gnu/perl/5.20/Time/Piece.pm line 469.

ЧЯДНТ?

Reply

what_me April 19 2017, 08:59:33 UTC
формат входных данных не ожидаемый.
Можно посмотреть кусок лога на котором он не работает?

Reply

linux007 April 19 2017, 09:32:18 UTC
Apr 19 12:30:35 mail140 amavis[8877]: (08877-04) Checking: oSe901dnZfzT [87.252.232.144] ->
Apr 19 12:30:36 mail140 policyd-spf[6662]: None; identity=helo; client-ip=62.134.46.9; helo=mx11.unify.com; envelope-from=noreply.confluence@unify.com; receiver=xxxx
Apr 19 12:30:36 mail140 policyd-spf[6662]: None; identity=mailfrom; client-ip=62.134.46.9; helo=mx11.unify.com; envelope-from=noreply.confluence@unify.com; receiver=xxxxxxxx
Apr 19 12:30:36 mail140 postfix/smtpd[6617]: 5C4DD2C084D: client=mx11.unify.com[62.134.46.9]
Apr 19 12:30:36 mail140 postfix/cleanup[6875]: 5C4DD2C084D: message-id=<1068671887.134762.1492594236036.JavaMail.confluence@gratcf02>

Reply

linux007 April 19 2017, 09:33:06 UTC
Ощущение, что не отрабатывает инициализация, ещё до анализа лога.

Reply

what_me April 19 2017, 09:46:47 UTC
Так должно быть видно, что ему не нравится

#!/usr/bin/env perl -ln
use Time::Piece;

INIT {
$pattern = '%b %d %T';
$start_time = Time::Piece->strptime(localtime->strftime($pattern), $pattern) - 600;
}

print if eval { $start_time < Time::Piece->strptime(substr($_,0,15), $pattern) };
warn "bad line format: $_\n" if $@;

Reply

linux007 April 19 2017, 10:02:14 UTC
Error parsing time at /usr/lib/i386-linux-gnu/perl/5.20/Time/Piece.pm line 469.
INIT failed--call queue aborted.

Reply

what_me April 19 2017, 10:15:41 UTC
А вот так работает ли?

$ perl -MTime::Piece -le 'print localtime->strftime("%b %d %T")'
Apr 19 13:13:38

$ perl -MTime::Piece -le 'print Time::Piece->strptime("Apr 19 13:13:38","%b %d %T")'
Sun Apr 19 13:13:38 1970

Reply

linux007 April 19 2017, 11:02:01 UTC
$ perl -MTime::Piece -le 'print localtime->strftime("%b %d %T")'
Крс 19 14:00:42
$ perl -MTime::Piece -le 'print Time::Piece->strptime("Apr 19 13:13:38","%b %d %T")'
Sun Apr 19 13:13:38 1970

Reply

what_me April 19 2017, 11:28:42 UTC
Белорусская локаль вмешалась
Вот так тогда.

#!/usr/bin/env perl -ln
use POSIX qw(locale_h);
use Time::Piece;

INIT {
setlocale(LC_TIME, "en_US");
$pattern = '%b %d %T';
$start_time = Time::Piece->strptime(localtime->strftime($pattern), $pattern) - 600;
}

print if eval { $start_time < Time::Piece->strptime(substr($_,0,15), $pattern) };
warn "bad line format: $_\n" if $@;

Reply


Leave a comment

Up