Вы могли использовать a pre-stop
директива в новомодном файле конфигурации,
Который будет выполняться перед приведением в нерабочее состояние сервиса, например,
pre-stop script
blabla
end script
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
Этот выходит, как только находит первое совпадение:
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'
Если файл действительно большой, не умещается в памяти, я использую 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