grep:始终显示 N 行的上下文

grep:始终显示 N 行的上下文

给定一个像这样的文件

asdasd
123
X
456
X
789
asd
asd
asd
asd

如果我grep -C3 'X'在上面运行 grep: ,我会得到以下结果

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

相关内容