如何用正则表达式统计各服务的many open files错误日志次数
解决方案:关联服务与"many open files"错误的正则及统计方法
正则表达式方案
要匹配服务标识行后(中间可包含WARNING等非服务行)的目标错误,需允许中间存在任意非服务行,同时避免跨服务关联,正则如下(需支持PCRE语法,比如grep -P):
(?s)(\w+Service).*?(?:(?!\w+Service).)*many open files
正则解释
(?s):开启单行模式,让.匹配换行符,支持跨多行匹配(\w+Service):捕获服务名称(如DEFService),可根据实际服务标识格式调整(比如服务行带括号就改成\[(\w+Service)\]).*?:非贪婪匹配服务行到错误行前的内容,避免过度匹配(?:(?!\w+Service).)*:匹配中间任意行(包括WARNING),但遇到新的服务标识行就停止,确保错误只关联到最近的服务many open files:精准匹配目标错误字符串
更高效的大型日志统计方案
纯正则匹配后还需二次统计,针对大型日志,用awk逐行处理更高效,直接完成服务关联与计数:
# 匹配服务标识行,记录当前服务(根据实际服务行格式调整$1的取值) /[A-Za-z]+Service/ { current_svc = $1 } # 匹配目标错误行,给当前服务计数+1 /many open files/ { count[current_svc]++ } # 最后输出每个服务的错误次数 END { for (svc in count) printf "%s: %d\n", svc, count[svc] }
使用时直接执行:awk -f count_errors.awk your_log_file.log,或把脚本写在一行:
awk '/[A-Za-z]+Service/{c=$1} /many open files/{cnt[c]++} END{for(s in cnt)print s": "cnt[s]}' your_log_file.log
内容的提问来源于stack exchange,提问作者Surabhi
相关产品推荐
相关产品推荐

