Есть ли способ анализировать и сортировать даты в строках?

Если у вас установлены и perl, и Date::Parseperl-модуль, вы можете сделать это с помощью:

perl -MDate::Parse -F, -a -n -e \
  'BEGIN { $start=time() - 600 ; $p=0};
   if ($p) { print } else {
     $logtime = str2time($F[0]);
     $p=1 if ($logtime >= $start)}' /path/to/logfile

Этот лайнер perl one -предполагает, что разделителем поля -между временной меткой файла журнала и остатком данных является запятая(-F,)и используется параметр perl auto -split(-a)для автоматического разделения каждой входной строки. в массив @F.

Он использует переменную $p в качестве переключателя для включения или выключения печати, по умолчанию выключено (0 ). Если $p включен, то напечатайте текущую строку, в противном случае используйте функцию Date::Parse's str2time()для преобразования временной метки записи журнала в значение времени _t (секунд синуса эпохи, 1970 -01 -01 00 :00 :00 ), а затем проверьте, соответствует ли отметка времени строки журнала >= желаемому времени начала (600 секунд, 10 минут назад ). Если это так, установите $p на (1 ).

Если у вас есть более сложные требования, вероятно, лучше написать отдельный сценарий Perl, а не пытаться сделать это в виде одной -строки -редактирование в командной строке bash — это PITA по сравнению с использованием текстового редактора..Вы можете начать с переделки вышеуказанного вкладыша -:

#!/usr/bin/perl

use Date::Parse;

$start = time() - 600;
$p = 0;

while (<>) {
  if ($p) {
    print
  } else {
    my (@F) = split /,/;
    my $logtime = str2time($F[0]);
    $p = 1 if ($logtime >= $start);
  }
}

напр. было бы довольно легко изменить этот скрипт, чтобы он брал время начала из первого аргумента командной строки, вместо того, чтобы жестко -закодировать его на -600 секунд.

Это можно было бы сделать в awkвместо perl, но Perl-модуль Date ::Parse хорош и прост в использовании, намного проще, чем писать код для разбора даты в awk. Дата ::Parse легко устанавливается из CPAN и доступен для некоторых дистрибутивов Linux (, например. в пакете libtimedate-perlна Debian ).

Тот же самый базовый алгоритм может быть написан на Python или любом другом языке с приличной функцией анализа даты.

2
24.08.2021, 03:47
0 ответов

Теги

Похожие вопросы