You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 16:25:30