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

如何使用bash脚本提取指定日期范围内的MongoDB访问日志

MongoDB日志按日期范围筛选脚本修改方案

核心逻辑:MongoDB日志使用的ISO 8601格式日期天然支持字符串字典序和时间序一致,无需转成时间戳即可直接比较大小,搭配awk即可同时完成ACCESS类型过滤和日期范围筛选。

修改后的完整脚本(支持传入起止日期参数)

#!/bin/bash

# 校验参数:传入2个参数 格式为 起始日期 结束日期 示例:./script.sh 2020-10-01 2020-10-03
if [ $# -ne 2 ];then
    echo "用法错误,请传入起止日期,示例:$0 2020-10-01 2020-10-03"
    exit 1
fi

# 转换传入的日期为日志匹配的前缀格式,补全时分秒覆盖全天范围
START_DATE="$1T00:00:00"
END_DATE="$2T23:59:59"

# Current Time
TIME=`/bin/date +%d-%m-%Y-%T`

# What to Backup(mongo).
BACKUP_FILE="/home/ubuntu/mongotest.log"

# Where to Backup Store.
DEST="/home/ubuntu/filterlogs"

# log file of backup file
NEW_FILE=$DEST/$TIME.log

# Create backup dir
/bin/mkdir -p $DEST

# 替换原grep逻辑,同时过滤ACCESS类型和日期范围
awk -v start="$START_DATE" -v end="$END_DATE" '$3 == "ACCESS" && $1 >= start && $1 <= end' "$BACKUP_FILE" >> "$NEW_FILE"

# Print start status message.
echo "已将$BACKUP_FILE中 $1 到 $2 的ACCESS日志备份到 $TIME.log"

关键修改说明

  • 新增参数校验逻辑,避免无参数运行出错。如果不需要动态传参,可直接把START_DATE和END_DATE写死为固定值即可,示例:
    START_DATE="2020-10-01T00:00:00"
    END_DATE="2020-10-07T23:59:59"
    
  • 用awk替代原grep命令:
    • 用-v参数把shell变量传入awk执行环境
    • $3 == "ACCESS"匹配ACCESS类型日志,比grep全字匹配精准度更高
    • $1 >= start && $1 <= end直接比较日志第一个字段(日期字段)和起止日期,实现范围过滤

内容的提问来源于stack exchange,提问作者Siddhesh Kirve

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:54:02