Простой способ проанализировать формат даты системного журнала

Я просто преобразовал в Kubuntu от Xubuntu на Точном. Выбрал kdm в качестве менеджера по оформлению и выполнения, таким образом, при следующем входе в систему был подарен 3 записей паролей всего - kdm экран входа в систему затем брелок для ключей гнома для Ubuntu Один и kwallet для Хрома. Сумасшедший!

Таким образом, мое решение в настоящее время: 1) используйте LightDM вместо KDM, который разблокировал брелок для ключей гнома, автоматически 2) настраивает kwallet с пустым паролем 3), использование домашнее шифрование папки

2
22.05.2013, 14:00
3 ответа

Это является немного слишком окольным для моего вкуса, но он может представлять интерес для Вас:

perl -p -e '
BEGIN{ 
        @months=qw(jan feb mar apr may jun jul aug sep oct nov dec);
        $month_number{$_}=++$i for @months;
        $months_regex= join "|",@months;
     }
s/^\s*($months_regex)[a-z]*\s+/$month_number{lc $1}-/i'
/var/log/syslog

Это распечатает (к stdout) строки журнала с датой в формате MM-DD (без нулевого дополнения для чисел месяца), который Вы, кажется, удобный парсинг. Это обрабатывает имена месяца, данные полностью и имена месяца, данные в 3 формах символов, независимо от случая.


Править

Если Вы хотите нулевое дополнение для чисел месяца, просто заменяете ++$i с sprintf "%02d",++$i

ОТРЕДАКТИРУЙТЕ 2 Две ошибки, зафиксированные благодаря комментариям l0b0 ниже:

  • Добавленный 'май' к списку месяцев
  • Измененный рецепт для нулевого дополнения к sprintf "%02d", ++$i
4
27.01.2020, 21:51

Вот то, как я сделал это в Perl, хотя я предпочитаю некоторые из других ответов!

use DateTime::Format::Strptime;
my $parser = DateTime::Format::Strptime->new( pattern => '%B %d %Y');
m/^(\w+ \d+)/;
print $parser->parse_datetime("$1 " . DateTime->now->year)->ymd;
2
27.01.2020, 21:51
  • 1
    , заменяющая дату: sudo perl -n -e 'use DateTime::Format::Strptime; my $parser = DateTime::Format::Strptime->new( pattern => "%B %d %Y"); m/^(\w+ \d+ )(.*)/; print ($parser->parse_datetime("$1" . DateTime->now->year)->ymd, " ", $2, "\n");' /var/log/syslog –  l0b0 23.05.2013, 15:49
  • 2
    @l0b0 Удобный :-P –  artfulrobot 24.05.2013, 15:56

Это было бы в порядке?

Каждая строка, содержащая дату> 10-й и <18-й:

awk '$2 > 10 && $2 < 18 {print}' file

Включая имя месяца:

awk '$1 == "May" && $2 > 10 && $2 < 18 {print}' file

Месяцы промежутка, 27-го апреля до 4-го мая:

awk '($1 == "Apr" && $2 > 26) || ($1 == "May" && $2 < 5){print}' file

Обновление:

Поверхностный вариант с помощью getline:

awk '"date '+%m%d' -d " $1$2 | getline date; close("date"); \
date > 426 && date < 505 {print}' file

Используя сценарий:

awk -v from=520 -v to=523 '
{
    d = ((match("JanFebMarAprMayJunJulAugSepOctNovDec", $1) + 2) / 3 )$2;
    if (d >= from && d <= to)
        print;

}
' file

Используя переключатель:

awk -v from=520 -v to=523 '
function date2time()
{
    switch ($1) {
    case "Jan": return 1$2; break;
    case "Feb": return 2$2; break;
    case "Mar": return 3$2; break;
    case "Apr": return 4$2; break;
    case "May": return 5$2; break;
    case "Jun": return 6$2; break;
    case "Jul": return 7$2; break;
    case "Aug": return 8$2; break;
    case "Sep": return 9$2; break;
    case "Oct": return 10$2; break;
    case "Nov": return 11$2; break;
    case "Dec": return 12$2; break;
    }
}
{
    d = date2time();
    if (d >= from && d <= to)
        print;

}
' file

Используя массив:

... oh see you have gotten your answer ;)
2
27.01.2020, 21:51
  • 1
    (cont'd) что относительно периодов, которые охватывают месяцы? –  artfulrobot 22.05.2013, 14:49
  • 2
    Спасибо, но все еще трудно обобщить это для данного промежутка. Должен был бы выбрать одну из 2-х или 3-х форм на основе того, отличался ли месяц. –  artfulrobot 22.05.2013, 14:55

Теги

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