Обратный захват

Вы могли использовать a pre-stop директива в новомодном файле конфигурации,

Который будет выполняться перед приведением в нерабочее состояние сервиса, например,

pre-stop script
   blabla
end script
44
04.09.2014, 20:02
4 ответа

tac/grep Решение

tac file | grep whatever

Или немного более эффективное:

grep whatever < <(tac file)

Время с файлом 500МБ:

real    0m1.225s
user    0m1.164s
sys     0m0.516s

sed/grep Решение:

sed '1!G;h;$!d' | grep whatever

Время с файлом 500МБ: Прервано через 10+ минут.

awk/grep Решение:

awk '{x[NR]=$0}END{while (NR) print x[NR--]}' file | grep whatever

Время с файлом 500 МБ:

real    0m5.626s
user    0m4.964s
sys     0m1.420s

perl/grep Решение:

perl -e 'print reverse <>' file | grep whatever

Время с файлом 500 МБ:

real    0m3.551s
user    0m3.104s
sys     0m1.036s
46
27.01.2020, 19:34

Этот выходит, как только находит первое совпадение:

 tac hugeproduction.log | grep -m1 WhatImLookingFor

Ниже приведены 5 строк до и после первых двух совпадений:

 tac hugeproduction.log | grep -m2 -A 5 -B 5 WhatImLookingFor

Не забудьте использовать -i (нечувствителен к регистру), если только это не приведет к замедлению грепа.

Если вы знаете точную строку, которую ищете, то учтите fgrep (Исправленная строка)

 tac hugeproduction.log | grep -F -m2 -A 5 -B 5 'ABC1234XYZ'
10
27.01.2020, 19:34

Это решение может помочь:

tac file_name | grep -e expression
17
27.01.2020, 19:34

Если файл действительно большой, не умещается в памяти, я использую Perl с модулем File::ReadBackwards из CPAN:

$ cat reverse-grep.pl
#!/usr/bin/perl

use strict;
use warnings;

use File::ReadBackwards;

my $pattern = shift;
my $rev = File::ReadBackwards->new(shift)
    or die "$!";

while (defined($_ = $rev->readline)) {
    print if /$pattern/;
}

$rev->close;

Затем:

$ ./reverse-grep.pl pattern file
9
27.01.2020, 19:34

Теги

Похожие вопросы