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