Я пытаюсь найти лаконичную оболочку с лаконичной оболочкой, которая даст мне все строки в файле до некоторый узор.Яркий способ распечатать все строки до последней строки, соответствующей заданному шаблону
Используемый случай сбрасывает все строки в файле журнала до тех пор, пока я не обнаружу маркер , указывающий, что сервер был перезапущен.
Вот глупый оболочечной единственный способ, который:
tail_file_to_pattern() {
pattern=$1
file=$2
tail -n$((1 + $(wc -l $file | cut -d' ' -f1) - $(grep -E -n "$pattern" $file | tail -n 1 | cut -d ':' -f1))) $file
}
Несколько более надежный способ Perl, который берет файл на стандартный ввод:
perl -we '
push @lines => $_ while <STDIN>;
my $pattern = $ARGV[0];
END {
my $last_match = 0;
for (my $i = @lines; $i--;) {
$last_match = $i and last if $lines[$i] =~ /$pattern/;
}
print @lines[$last_match..$#lines];
}
'
И, конечно, вы могли бы сделать это более эффективно быть открыв файл, , ищем конец и ища назад, пока не найдете подходящую строку.
Легко напечатать все, как в первого появления, например .:
sed -n '/PATTERN/,$p'
Но я не придумал способ напечатать все, как в последней вхождение.
Ваше название говорит «все линии вплоть до последний шаблон ", но ваши два примера скриптов печатают все строки от последнего шаблона до конца. Я предполагаю, что это название вводит в заблуждение? –
Если шаблон обычно присутствует и находится ближе к концу, вы можете рассмотреть [File :: ReadBackwards] (http://search.cpan.org/perldoc?File::ReadBackwards) (не переключаясь в буфер до тех пор, пока вы не достигнете шаблон или начало файла). – ikegami