grep 仅适用于导致错误的进程行

grep 仅适用于导致错误的进程行

有一项服务作为多个进程运行,所有日志都形成一个巨大的日志(不要问我为什么)。它看起来像这样:

process1: bla bla bla
process2: ha ha ha
process3: tarara **error_has_happened**
process3: details of the error here
process1: bla bla bla
process3: more details of the error here
process2: ha ha ha

该错误可能发生在任何进程中,因此我希望我的 grep 为所有进程找到此错误:

process3: tarara **error_has_happened**
process3: details of the error here
process3: more details of the error here

所以基本上检测到已发生错误以及它发生的过程,并仅从该过程打印接下来的 N 行。假设来自不同进程的错误详细信息日志不是交错的,则所有出现此错误的进程都应该发生这种情况

是否可以单独使用 grep 来完成此操作?如何?

答案1

你可以这样做:

grep "error_has_happened" -A3 logfile.log

其中 3 是 error_has_happened 出现后将显示的行数。但是,这还将显示其他进程输出,而不仅仅是发送错误的进程的输出。

在快速测试中对我有用的更详细的命令是:

grep "error_has_happened" logfile.log | cut -d : -f1 | sort -u |
  while IFS= read -r process; do
    grep "^$process:" logfile.log |
      grep -A3 "error_has_happened"
  done

答案2

使用awk, 打印错误行以及该进程之后的 10 行:

awk -F : -v N=10 '/error_has_happened/ {n[$1] = N+1}
                  n[$1]-- > 0' logfile.log

相关内容