大文字と小文字の一致とコンテキスト一致を除く Grep ファイルの内容

大文字と小文字の一致とコンテキスト一致を除く Grep ファイルの内容

次の内容を含む test.txt ファイルがあります。

line random text 1
line random text 2
line random text 3
line particular exception 
line except detail 1
line except detail 2
line except detail 3
....
line random text 14
line random text 15
line random text 16
line particular exception 
line except detail 1
line except detail 2
line except detail 3
.....

「特定の例外」が発生するファイルの内容をフィルタリングし、その後に表示される「特定の例外」の詳細(常に3行)をフィルタリングするための出力(追加のgrep用)が必要です。

私が思いついた論理コマンドは次のとおりです。

cat test.txt | grep -v -A 3 "particular exception"

しかし、期待どおりに動作しません。

これを行う正しい方法は何ですか?

いくつかの状況では、繰り返される特定の例外を除いてログファイルで例外を探すことになるので、まずその例外を消去したいと思います。

答え1

grep代わりに、以下を使用してGNUを使用できますsed

sed -e '/particular exception/,+3d' test.txt

その後、一致する行を見つけて、その行particular exceptionとその後の3行を削除します。

答え2

使用awk:

$ awk -v n=3 -v p='particular exception' 'match($0,p) { skip=n+1 } --skip < 0' test.txt
line random text 1
line random text 2
line random text 3
....
line random text 14
line random text 15
line random text 16
.....

スキップされた末尾のコンテキストの行数はコマンドラインにegで指定され-v n=3、一致させる正規表現もコマンドラインで指定されます-v p='expression'

1行を読み込むたびに変数はskip1ずつ減少し、変数が0より小さい場合、skipスクリプトは現在の行を印刷します。興味のあるパターンが見つかると、skip変数はその値を取得し、n + 1これはn現在の行と追加の行をスキップすることを意味します。

match($0,p)と書くこともできます$0 ~ p

関連情報