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

如何用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"

关键细节说明

  1. 时间戳转换:用date +%s把12小时制带AM/PM的时间转成秒数,彻底避免时间格式的歧义
  2. 区间计算:
    • 先拿到当前时间减1小时的整点时间(比如14:01:00减1小时后取13:00:00)作为区间起点
    • 再取该小时的最后一秒(13:59:59)作为区间终点
  3. 容错处理:2>/dev/null用来屏蔽无效时间格式的报错,确保脚本能正常跑完所有行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 22:10:48