2015-08-08 2 views
-3

Я хочу, чтобы дата и время grep записывались в формате ниже и присваивали его переменной, удаляющей пробелы и двоеточия. Пожалуйста, предложите для этого регулярные выражения.Что касается регулярного выражения в Perl

07 Aug 2015 00:09:14 

Дело в том, что я хочу Grep этот формат в определенной строке, которая содержит «CURRENT_RUN_ID». Например: строка будет выглядеть так:

07 Aug 2015 00:09:14 -- INFO -- *** CURRENT_RUN_ID=600 

мне нужно, чтобы захватить дату и время только с этой конкретной линии, которая содержит «CURRENT_RUN_ID».

+2

Что вы пробовали? Как бы вы проверили, что строка содержит текущую строку ID запуска? Как вы могли бы извлечь часть даты/времени из строки? Все это выглядит довольно прямолинейно, если вы делаете это в двух операциях. Если вы думаете, что вы должны сделать все это в одном, то это тоже можно сделать, но делать отдельные операции, вероятно, проще - и, как правило, проще, если вам нужно спросить, как это сделать. –

ответ

4

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

# 07 Aug 2015 00:09:14 -- INFO -- *** CURRENT_RUN_ID=600 
my($date_string, $flag, $message) = split /\s*--\s*/, $line, 3; 

Тогда я превратить дату в объект Time :: Кусок с помощью Time::Piece->strptime. Это принимает аргументы формата, такие как strftime.

my $date = Time::Piece->strptime($date_string, '%d %b %Y %H:%M:%S'); 

Тогда вы можете играть с $date как удобный объект Time :: шт.

1
#!/usr/bin/perl 
use strict; 
use warnings; 

while (<>) 
{ 
    if (m/^(\d\d) (\w{3}) (\d{4}) (\d\d):(\d\d):(\d\d) .*CURRENT_RUN_ID/) 
    { 
     my $var = "$1$2$3$4$5$6"; 
     print "$var\n"; 
    } 
} 

Посмотрите на 2 цифр, букв 3, 4 цифры, и последовательность пар цифр с пробелами и двоеточием в качестве разделителей, а затем CURRENT_RUN_ID. Если это соответствует, соберите строку без пробелов или двоеточий и назначьте переменную. Распечатать.

1

Первое регулярное выражение для получения соответствующей строки. Второе регулярное выражение удаляет пробел & ':' с даты времени.

my $string = '07 Aug 2015 00:09:14 -- INFO -- *** CURRENT_RUN_ID=600'; 
if ($string =~ /^(\d{2}\s[A-Z][a-z]{2}\s\d{4}\s\d{2}:\d{2}:\d{2}).+CURRENT_RUN_ID/) { 
    my $datetime = $1; 
    $datetime =~ s/[\s|:]//gc; 
} 
Смежные вопросы