поиск абзаца в обратном порядке без массива в perl - PullRequest
1 голос
/ 16 февраля 2020

У меня есть файл журнала, где ошибки будут упоминаться как «ОШИБКА» в начале строки, а в следующей строке будет содержаться подробный текст об ошибке. Я хотел бы найти «ОШИБКА» в обратном порядке, чтобы я мог найти последнюю ошибку и напечатать следующую строку или скопировать строку в переменную.

В оболочке я могу попробовать приведенную ниже команду, которая будет Помоги мне достичь того же. Может кто-нибудь дать мне эквивалентный perl код.

grep -A2 ERROR sapinst.log | tail -2

Поскольку файл журнала будет огромным (~ 5000 + строк), поэтому я не хочу хранить его в массиве.

1 Ответ

4 голосов
/ 16 февраля 2020

Ваш размер файла довольно маленький, а perl довольно быстрый, поэтому я бы не стал беспокоиться об обратном порядке. Эта небольшая программа читает строки ввода из файлов, которые вы указали в командной строке (или стандартный ввод, если вы ничего не указали), пропускает строки до тех пор, пока не найдет ERROR, затем печатает эту и следующую строку:

#!perl

while( <> ) {
    next unless /ERROR/;
    print;
    print scalar <>;
    }

Оттуда вы можете использовать tail, если хотите. Это Perl делает то же самое, что и опубликованный вами grep (хотя, поскольку у вас уже есть это решение, мне интересно, почему вы хотите другое).

Если вы не хотите использовать tail, следите из двух строк, которые вы выведете и замените их, когда найдете новый набор:

my( $error_line, $next_line );
while( <> ) {
    next unless /ERROR/;
    $error_line = $_;
    $next_line = scalar <>;
    }

print $error_line, $next_line;

Если у вас достаточно недавно perl, вы можете использовать более безопасный оператор ввода двойных ромбов :

use v5.22;

my( $error_line, $next_line );
while( <<>> ) {
    next unless /ERROR/;
    $error_line = $_;
    $next_line = scalar <<>>;
    }

print $error_line, $next_line;

Вы можете использовать File :: ReadBackwards , но вам придется выполнить ту же задачу, запоминая каждую строку, а затем проверяя, имела ли предыдущая строка ERROR. Для ваших размеров данных выгода, вероятно, не очевидна. Если простое решение не достаточно быстрое, пришло время задуматься (но не раньше).

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