如何用Bash脚本过滤文件中最近1小时时间戳的行?
过滤文件中时间在当前时间前一小时范围内的行
需求说明
要从指定文件里挑出前两列时间落在当前时间往前推1小时的整小时区间内的行。举个实际例子:
- 如果脚本执行时的时间是
14:01:00,那我们要找的就是13:00:00到13:59:59之间的记录 - 对应给出的示例文件,只有
01:51:56 PM col3 col4 ...这一行符合要求
现有问题
你已经写了循环读取文件的基础代码,但不知道怎么写时间对比的判断条件。
完整解决方案
最靠谱的办法是把所有时间转换成Unix时间戳(也就是从1970年1月1日到该时间的总秒数),这样直接用数值大小就能判断是否在目标区间里。修改后的完整代码如下:
varDataFile="fileName.txt" # 获取当前时间的Unix时间戳 cur_timestamp=$(date +%s) # 计算目标时间段的起始(前一小时整点)和结束(前一小时最后一秒)时间戳 start_timestamp=$(date -d "$(date -d "-1 hour" +"%Y-%m-%d %H:00:00")" +%s) end_timestamp=$(date -d "$(date -d "-1 hour" +"%Y-%m-%d %H:59:59")" +%s) while read -r line do # 提取当前行的时间字段(前两列) line_time=$(echo "$line" | awk '{print $1 " " $2}') # 将行内时间转换为Unix时间戳,忽略转换失败的无效行 line_timestamp=$(date -d "$line_time" +%s 2>/dev/null) # 判断当前行时间是否在目标区间内 if [[ -n "$line_timestamp" && "$line_timestamp" -ge "$start_timestamp" && "$line_timestamp" -le "$end_timestamp" ]]; then echo "$line" fi done < "$varDataFile"
关键细节说明
- 时间戳转换:用
date +%s把12小时制带AM/PM的时间转成秒数,彻底避免时间格式的歧义 - 区间计算:
- 先拿到当前时间减1小时的整点时间(比如14:01:00减1小时后取13:00:00)作为区间起点
- 再取该小时的最后一秒(13:59:59)作为区间终点
- 容错处理:
2>/dev/null用来屏蔽无效时间格式的报错,确保脚本能正常跑完所有行
内容的提问来源于stack exchange,提问作者Lastwish
相关产品推荐
相关产品推荐

