如何筛选当日当前小时日志?bash脚本误匹配问题排查与优化
解决日志筛选误匹配历史同小时条目的问题
问题根源
之前用date --date='now-60 minutes'的方式匹配,仅限定了时间范围但未绑定当日日期,导致会命中历史日期里的同小时日志(比如7月11日14点会匹配到6月14日14点的条目)。
优化方案
直接生成当日当前小时的时间前缀,用这个前缀精准过滤日志,只保留当日当前小时的条目,再按操作类型分情况处理。
完整脚本示例
#!/bin/bash # 生成当日当前小时的时间前缀,格式与date无参数输出的前4段一致(如:Wed Jul 11 14) current_hour_prefix=$(date +"%a %b %d %H") # 过滤日志中当日当前小时的条目,逐行处理 grep "^$current_hour_prefix" /path/to/your/logfile.log | while IFS= read -r line; do # 拆分字段:把时间部分后的第一个字段作为操作类型 # 注意:这里假设时间部分是前4个空格分隔的字段,第5个字段是操作类型 action=$(echo "$line" | awk '{print $5}') full_action=$(echo "$line" | awk '{for(i=5;i<=NF;i++) printf "%s ",$i; print ""}') case "$action" in purchased) # 执行购买操作的逻辑,示例:打印日志 echo "[处理购买] $line" # 替换为你的实际操作,比如调用脚本、写入记录等 ;; returned) # 判断是否是全退货的特殊情况 if [[ "$full_action" =~ ^returned\ \(returned\ all\) ]]; then echo "[处理全退货] $line" # 全退货操作逻辑 else echo "[处理普通退货] $line" # 普通退货操作逻辑 fi ;; *) # 处理未知操作类型 echo "[未知操作] $line" ;; esac done
关键说明
精准过滤逻辑:
date +"%a %b %d %H"生成的前缀包含星期、月份、日期、小时,用grep "^$current_hour_prefix"可以确保只匹配当日当前小时的日志,彻底规避历史日期的同小时条目。操作类型匹配:
- 普通
purchased和returned直接匹配对应字段(可根据你的日志实际字段位置调整awk '{print $5}'的数字)。 - 对于
returned (returned all)这种带空格和括号的操作类型,需要捕获完整的操作字符串,再用正则判断。
- 普通
适配日志格式:
如果你的日志中操作类型的字段位置不同(比如时间部分是前6个字段,操作类型是第7个),只需调整awk中的字段序号即可。
内容的提问来源于stack exchange,提问作者Saeed
相关产品推荐
相关产品推荐

