2013-07-10 1 views
1

У меня есть файл журнала, который выглядит, как показано ниже:Perl извлечения данных из файла на основе состояния

874899 [email protected] to execute some files 
    Exit Status : 0 
    Exit time : Sun May 5 18:19:39 2013 
874923 [email protected] to execute some files 
    Exit Status : 2 
    Exit time : Sun May 5 18:19:42 2013 

У меня есть скрипт, который смотрит на шаблон и возвращает строку ниже этого подходящего шаблона. Сценарий выглядит следующим образом:

open(FH,'log.txt'); 
while ($line = <FH>) { 
    if ($line =~ /Exit Status/) { 
     print "$line"; 
     print scalar <FH>; 
    } 
} 

мне нужен ввод о том, как я должен делать это так, что он соответствует Exit status (как 2 в данном случае) и сохранить 874923 линию вместе с командами (В этом случае) и Exit Time как две отдельные переменные.

Пожалуйста, исправьте меня, поскольку я новичок в Perl.

+0

Что вы имеете в виду 'Выход Time' как два отдельных Варс? Вы хотите, чтобы текст его в одном var и дата/время в другом? – hwnd

+0

@JasonGray Благодарим вас за быстрый ответ. Время вывода - это просто переменная в этом случае. Но являются переменными в соответствии с файлами журнала. – deep

+0

Неясно, из вашего вопроса, что ваш файл журнала содержит. Я предполагаю, что '# Состоит из трех строк вывода' не находится в файле, но есть' {...} 'там? И есть ли три строки данных, включая * «Статус выхода» и «Время выхода», или пять строк в общей записи? Не могли бы вы просто опубликовать данные в реальном времени? Было бы намного проще понять. – Borodin

ответ

0

С помощью хэш, это то, что я использовал:

use Data::Dumper; 
open(FH,'inlog.txt'); 

my %stat; 

my ($exitstatus, $exitstatusval, $exittime, $exittimeval, $exitcommands); 
while ($line = <FH>) { 
    if ($line =~ m/^(\d+)\s+.*@(.*)/) { 
     $exitcommands = $2; 
     $qbsid= $1; 
    } 
    if ($line =~ /Exit Status/) { 
     ($exitstatus, $exitstatusval) = split(':',$line); 
     next; 
    } 
    if ($line =~ /Exit time/ and $exitstatusval == 2) { 
     ($exittime, $exittimeval) = split(': ',$line); 
     $stat{$qbsid} = { 
      commands => $exitcommands, 
      time  => $exittimeval 
      }; 
    } 

}

print(Dumper(\%stat)); 
0

Это, как я бы это сделать ...

use Data::Dumper; 

open(FH,'<','log.txt'); 
my $current_log; 
my @logs; 
while (my $line = <FH>) { 
    if($line =~ /^\s*(\d+)\sroot\@(.*)/) { 
    if($current_log) { 
     push @logs,$current_log; 
    } 
    $current_log = {}; 
    $current_log->{pid} = $1; 
    $current_log->{command} = $2; 
    } 
    if ($line =~ /Exit Status\s*:\s*(\d+)/) { 
    $current_log->{exit_status} = $1; 
    } 
    if($line =~ /Exit time\s*:\s*(.+)$/) { 
    $current_log->{exit_time} = $1; 
    } 
} 
if($current_log) { 
    push @logs,$current_log; 
} 

print Dumper \@logs; 

Это должно напечатать следующее:

$VAR1 = [ 
     { 
     'exit_time' => 'Sun May 5 18:19:39 2013', 
     'pid' => '874899', 
     'exit_status' => '0', 
     'command' => 'commands to execute some files' 
     }, 
     { 
     'exit_time' => 'Sun May 5 18:19:42 2013', 
     'pid' => '874923', 
     'exit_status' => '2', 
     'command' => 'commands to execute some files' 
     } 
    ]; 
+1

@Gordolia Спасибо за ваше время и ответ :-) – deep

1

Ваш код может выглядеть так:

use Data::Dumper; 
open(FH,'inlog.txt'); 

my @stat; 

my ($exitstatus, $exitstatusval, $exittime, $exittimeval, $exitcommands); 
while ($line = <FH>) { 
     if ($line =~ m/\d+\s+.*@.*/) { 
      $exitcommands = $line; 
     } 
     if ($line =~ /Exit Status/) { 
      ($exitstatus, $exitstatusval) = split(':',$line); 
      next; 
     } 
     if ($line =~ /Exit time/ and $exitstatusval == 2) { 
      ($exittime, $exittimeval) = split(': ',$line); 
      push (@stat, { 
       commands => $exitcommands, 
       time => $exittimeval 
       }); 
     } 
} 

print(Dumper(\@stat)); 

Выход : Итак, это напечатает 'arrayref of hashrefs' для записей, имеющих статус выхода 2

$VAR1 = [ 
      { 
      'time' => 'Sun May 5 18:19:42 2013 ', 
      'commands' => '874923 [email protected] to execute some files ' 
      }, 
      { 
      'time' => 'Sun May 4 18:19:42 2013', 
      'commands' => '874613 [email protected] to execute some files ' 
      } 
     ]; 
+0

Спасибо за ваш ответ ... Ваш скрипт отличает статус выхода 0, 1 и 2 только для ограниченного количества записей. Что делать, если есть файл с много таких записей, и мне нужна информация только для статуса выхода: 2. Спасибо. – deep

+0

@deep См. Отредактированный ответ –

+0

Благодарим вас за ответ. Но ваш код не получает итерации для всего файла. Я получаю только одно значение для статуса выхода: 2, в то время как у него есть много переменных, прикрепленных к нему. Можете ли вы помочь мне узнать, где я ошибаюсь? Спасибо. – deep

Смежные вопросы