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

関連情報