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

Я пытаюсь найти краткую формулировку оболочки, которая даст мне все строк в файле вплоть до некоторого шаблона.

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

Вот глупый способ, использующий только оболочку:

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'

, но я не придумал способ распечатать все, начиная с последнего возникновение.

7
задан Ævar Arnfjörð Bjarmason 22 January 2012 в 16:33
поделиться