Многострочный поиск строк с использованием sed или perl - PullRequest
0 голосов
/ 23 февраля 2012

Вы можете сказать, что это повторяющийся пост ... но я пробовал предыдущие решения, и они, похоже, не работают! По какой-то причине для perl я вижу решения, включающие замену подстановки, но они заменяют шаблон сопоставления текста вместо его отображения! Ниже приведен исходный текст

ClassOne:error=9607
ClassTwo:This is junk test
ClassThree:I|want|to|extract|this|text|after|error=9607

Я хочу извлечь все строки, содержащие ClassThree:.... после того, как нашел error=9607. Желательно, чтобы для этого требовалась однострочная команда, потому что я буду запускать ее через несколько файлов на большом количестве серверов (используя команду в строке с командой ssh).

Помощь / указатели в этом отношении приветствуются.

Ответы [ 4 ]

1 голос
/ 23 февраля 2012

Это может работать для вас:

sed '/error=9607/,/ClassThree/{//!d}' file
ClassOne:error=9607
ClassThree:I|want|to|extract|this|text|after|error=9607

Если вы хотите только строку ClassThree:

sed '/error=9607/,/ClassThree/{/ClassThree/!d}' file
ClassThree:I|want|to|extract|this|text|after|error=9607

Если вы хотите, чтобы все строки, содержащие ClassThree, впоследствии:

cat <<! >file
> ClassOne:error=9607
> ClassTwo:This is junk test
> ClassThree:I|want|to|extract|this|text|after|error=9607
> ClassOne:error=9608
> ClassTwo:This is junk test
> ClassThree:I|want|to|extract|this|text|after|error=9607
> ClassOne:error=9609
> ClassTwo:This is junk test
> ClassThree:I|want|to|extract|this|text|after|error=9607
>!
sed '/error=9607/h;G;/ClassThree.*\n./P;d' file
ClassThree:I|want|to|extract|this|text|after|error=9607
ClassThree:I|want|to|extract|this|text|after|error=9607
ClassThree:I|want|to|extract|this|text|after|error=9607

или это решение awk:

 awk '/error=9607/{p=1};/ClassThree/ && p' file
1 голос
/ 23 февраля 2012

Если ClassThree всегда будет через 2 строки после error=9607, вы можете просто:

grep -A 2 'error=9607' input.txt
0 голосов
/ 23 февраля 2012
$ perl -ple 'print if /^ClassThree/ && /error=9607/ .. /\0/' file
0 голосов
/ 23 февраля 2012

Вот попытка Perl

Редактировать: я также добавил проверку конкретных ошибок

use strict;
my @errors = (9607,9608);
open(FILE,"filescan.txt")||die "Error: cannot read file\n$!";
while(<FILE>){
    chomp(my $line = $_ );
    if ( $line =~ /^ClassOne:error=(\d+)/ ) {
        my $errorCode = $1;
        if ( grep { $_ == $errorCode } @errors ) {
            print "$line\n";
            while(<FILE>){
                chomp(my $line = $_ );
                if ( $line =~ /^ClassThree:.*\|error=$errorCode/ ) {
                    print "$line\n";
                    last;
                }
            }
            print "----------\n";
        }
    }
}
close FILE;

Вывод:

ClassOne:error=9607
ClassThree:I|want|to|extract|this|text|after|error=9607
----------
ClassOne:error=9608
ClassThree:I|want|to|extract|this|text|after|error=9608
----------
...