이와 같은 파일이 주어지면
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