grep: 항상 N줄의 컨텍스트를 표시합니다.

grep: 항상 N줄의 컨텍스트를 표시합니다.

이와 같은 파일이 주어지면

asdasd
123
X
456
X
789
asd
asd
asd
asd

grep:을 실행 하면 grep -C3 'X'다음과 같은 결과가 나타납니다.

asdasd
123
X
456
--
456
X
789
asd
asd

grep은 각 일치 항목의 컨텍스트를 이전 또는 다음 일치 항목에만 표시하는 것 같습니다. 패턴이 포함되어 있는지 여부에 관계없이 전체 컨텍스트를 표시하도록 하는 방법이 있습니까? 살펴보니 man grep그런 선택지는 없는 것 같습니다. 예상되는 결과는 다음과 같습니다.

asdasd
123
X
456
X
789
--
123
X
456
X
789
asd
asd

답변1

다음은 이를 수행하는 짧은 Perl 스크립트입니다. 전체 파일을 메모리로 읽어들이기 때문에 매우 큰 파일에는 적합하지 않을 수 있습니다.

perl -0777 -snE '
    @lines = split /\n/;
    for $idx (grep {$lines[$_] =~ $p} 0...$#lines) {
        say join "\n", @lines[$idx-($n-1) .. $idx+($n-1)], "--";
    }
' -- -n=3 -p='X' file

관련 정보