Я пытаюсь найти краткую формулировку оболочки, которая даст мне все строк в файле вплоть до некоторого шаблона.
Пример использования - выгрузить все строки в файл журнала, пока я не найду некоторые маркер, указывающий, что сервер был перезапущен.
Вот глупый способ, использующий только оболочку:
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'
, но я не придумал способ распечатать все, начиная с последнего возникновение.