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
.....

我想输出(用于进一步 grep)过滤出现“特定异常”的文件内容,并过滤出现在其之后的“特定异常”详细信息(始终为 3 行)。

我想到的逻辑命令是这样的:

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

但它并没有像我预期的那样工作。

这样做的正确方法是什么?

对于某些上下文,我想做的是在日志文件中查找异常,除了不断重复的特定异常,所以首先我想清除它。

答案1

grep您可以使用 GNU来代替使用sed

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

这会找到匹配的行particular exception并删除它们及其后面的三行。

答案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'

每读取一行,变量skip就会减一,只要变量skip小于零,脚本就会打印当前行。当找到感兴趣的模式时,skip变量将获得该值,n + 1这意味着n将跳过当前行和更多行。

match($0,p)也可以写成$0 ~ p.

相关内容