Прочитайте файл журнала в Perl и найдите значение в квадратных скобках - PullRequest
0 голосов
/ 25 января 2019

У меня есть logfile.txt, в котором есть журнал выполнения определенного теста. Пример этого файла показан ниже. Хотя у него есть много других строк, но я удалил их ради простоты.

В этом logfile.txt моя последняя цель - получить шестнадцатеричное значение в квадратных скобках в последней строке.

Я написал пример кода в PERL для поиска последней строки и печати, но я не могу сформулировать регулярное выражение для получения желаемого значения.

Мой код:

#!/usr/bin/perl

my $logfile = "/path/to/logfile.txt";
open ( IN1 , $logfile) or die "Cannot find the file $logfile \n";
while (<IN1>)
    {
        chomp ($_);
        print $_ if ($_ =~ m/The job has completed/i);
    }
close (IN1);

ВХОД

   > cat logfile.txt

Waiting for the completion of job..
.
.
.
.
.


The job has completed, returning [0x0]

OUTPUT

0x0

Ответы [ 3 ]

0 голосов
/ 25 января 2019

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

^The job has completed,.*?\[\K0[xX][0-9a-fA-F]+(?=\])

Regex demo

Это будет соответствовать:

  • ^The job has completed, Совпадение буквально с начала строки
  • .*? Совпадение с любым символом, не жадным
  • \[\K Совпадение с открывающей скобкой и забывание того, что было найдено с помощью \K
  • 0[xX][0-9a-fA-F]+ Соответствует шестнадцатеричному числу
  • (?=\]) Положительный прогноз, чтобы проверить, что следует за закрывающей скобкой
0 голосов
/ 25 января 2019

Попробуйте этот Perl однострочный

$ perl -lne ' if(eof) { /.*\[(.*)\].*/ and print "Hex = $1" } ' logfile.txt
Hex = 0x0
$

Еще короче .. Спасибо @Dave Cross

$ perl -lne ' if(eof) { /\[(.*)\]/ and print "Hex = $1" } ' logfile.txt
Hex = 0x0
$

Если вы хотите убедиться, что «Задание выполнено» в последней строкетогда

$  perl -lne ' if(eof) { /The job has completed.*\[(.*)\].*/ and print "Hex = $1" } ' logfile.txt
Hex = 0x0
$
0 голосов
/ 25 января 2019

Примерно так:

#!/usr/bin/perl

use strict;
use warnings;

open my $log_fh, '<', 'logfile.txt' or die $!;

while (<$log_fh>) {
  print $1 if /The job has completed.+\[(.+)\]/;
}

Я использовал скобки ((...)), чтобы "захватить" все, что появляется между [ и ].Когда регулярное выражение совпадает, захваченный текст будет сохранен в $1.

Обратите внимание, я также обновил ваш код, чтобы использовать более современные идиомы для открытия файлов.А) использовать лексический дескриптор файла, б) использовать версию с тремя аргументами open() и в) проверить возвращаемое значение из open() и завершить работу программы в случае сбоя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...