如何使用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
相关产品推荐
相关产品推荐

