Bash脚本统计日志文件近5分钟内指定字符串出现次数
问题分析与解决方案
原脚本存在几个关键问题导致无法正常运行:
- 不必要的外层命令替换
$(...),会引发语法错误,直接执行命令即可,无需包裹。 - 日志日期被
[]包裹,直接用整行与无括号的日期字符串比较,逻辑完全失效,必须提取括号内的日期部分再做比较。 - 若要统计字符串出现次数而非包含该字符串的行数,原
grep -ci仅统计行数,无法满足需求。
修正后的脚本(两种场景)
场景1:统计近5分钟内包含指定字符串的日志行数
#!/bin/sh awk -v d1="$(date --date="-5 min" "+%b %_d %H:%M:%S")" -v d2="$(date "+%b %_d %H:%M:%S")" ' # 提取日志行开头括号内的日期字符串 match($0, /^\[([^]]+)\]/, m) { log_date = m[1] # 判断日期是否在近5分钟范围内 if (log_date >= d1 && log_date <= d2) { print $0 } } ' "$1" | grep -ci "$2"
场景2:统计近5分钟内指定字符串的总出现次数(一行多次出现也计数)
#!/bin/sh awk -v d1="$(date --date="-5 min" "+%b %_d %H:%M:%S")" -v d2="$(date "+%b %_d %H:%M:%S")" -v pattern="$2" ' match($0, /^\[([^]]+)\]/, m) { log_date = m[1] if (log_date >= d1 && log_date <= d2) { # 统计当前行中指定字符串的出现次数并累加 cnt += gsub(pattern, "&") } } # 最后输出总次数 END { print cnt } ' "$1"
使用说明
调用方式保持不变:
sh 你的脚本名 /var/log/message "day"
内容的提问来源于stack exchange,提问作者zia
相关产品推荐
相关产品推荐

