次の内容を含む 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行を読み込むたびに変数はskip
1ずつ減少し、変数が0より小さい場合、skip
スクリプトは現在の行を印刷します。興味のあるパターンが見つかると、skip
変数はその値を取得し、n + 1
これはn
現在の行と追加の行をスキップすることを意味します。
match($0,p)
と書くこともできます$0 ~ p
。