2013-05-10 2 views
0

мне нужно, чтобы соответствовать и извлечь линию с pattern1 из бревна, который должен прийти после другого pattern2 согласованной линии: , например, журнал имеет данные следующим образом:Perl регулярное выражение: второй шаблон матч на основе первого одного

00:00:01 Computing CDA. 
00:01:10 Trying to open errorLog1. 
00:01:12 writing errorLog1. 
00:01:13 Trying to open outLog1. 
00:01:14 writing outLog1. 
00:01:15 Processing Complete! 
00:01:16 Validating documents. 
00:02:14 Trying to open errorLog2. 
00:02:12 writing errorLog2. 
00:02:13 Trying to open outLog2. 
00:02:14 writing outLog2. 
00:02:15 Processing Complete! 

Мне нужно вычислить затраченное время (первая колонка) для проверки документа. Поэтому я хочу получить строку с строкой «Validating document» и строкой «Обработка завершена», чтобы извлечь время и получить разницу. Это может быть легко, но я не могу понять решение.

ответ

1

Это должно работать:

if ($subject =~ m/(\d{2}:\d{2}:\d{2}) Validating documents\..*?(\d{2}:\d{2}:\d{2}) Processing Complete!/s) { 
    $start = $1; 
    $end = $2; 
    # Calculating the time difference is left as an exercise :) 
} 
+0

(Предполагается, что вы прочитали весь документ в виде одной строки под названием '$ subject'). –

0
perl -lane '$a=$F[0] if(/Validating documents/);if(/Processing Complete/){print $F[0]-$a}' your_file 

я просто упомянул $F[0]-$a в коде, но его не так, как время calculated.But это та часть, где у вас есть работа и вычислить разницу во времени , $F[0] содержит время завершения обработки в строке

+0

$ F [0] возвращает два разных раза «завершения обработки», тогда как мне нужно время, когда оно приходит после утверждения «проверки документов». Просто, чтобы получить время, я пытаюсь это сделать: 'code'perl -lane '$ a = $ F [0] if (/ Проверка документов /); if (/ Обработка завершена /) {print $ F [0 ], $ a} 'input_file #slyly modified. Но выход выглядит следующим образом: 00:01:15 00: 02: 1500: 01: 16 – Freeman

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