我有一个文件 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
.