计算匹配模式和匹配上一行的行数

use*_*814 5 grep shell-script text-processing wc

我想统计一个角色被成功删除的次数。问题是日志文件的一行会显示脚本即将删除角色:

Prepare to remove role X
Run Code Online (Sandbox Code Playgroud)

下一行将告诉我删除是否成功:

删除成功:

Delete Successful
Run Code Online (Sandbox Code Playgroud)

删除失败:

Failed to delete role X: error code
Run Code Online (Sandbox Code Playgroud)

如何计算成功删除角色的次数?我只会使用以下 grep:

grep "Delete Successful" | wc -l
Run Code Online (Sandbox Code Playgroud)

但是,我也在删除以与上述角色相同的方式记录的策略。IE:

Prepare to delete policy X
Delete Successful
Run Code Online (Sandbox Code Playgroud)

或者

Failed to delete policy X: error code
Run Code Online (Sandbox Code Playgroud)

有没有办法在一行上搜索“准备删除角色”,然后计算下一行说“删除成功”的次数?

les*_*ana 6

如果您grep是 GNU grep,这是一个快速而肮脏的解决方案:

grep -A1 "Prepare to remove role" | grep "Delete Successful" | wc -l
Run Code Online (Sandbox Code Playgroud)

grep 选项-A1告诉 grep 打印匹配行和匹配行后面的一行。然后第二个 grep 只打印删除成功的行。

请注意,只有在“准备删除角色 X”行后面紧跟“删除成功”行时,这才会可靠地工作。

另请注意:您不需要,wc -l因为 grep 内置了该功能:

grep -A1 "Prepare to remove role" | grep -c "Delete Successful"
Run Code Online (Sandbox Code Playgroud)