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

Linux中如何筛选指定日期区间内含特定字符串的日志?

解决日志时间范围+IP筛选的问题

你的需求是筛选2022-10-12 16:00:00至2022-10-13 18:00:00之间且包含192.168.1.1的日志,直接用grep无法实现——它只能做文本匹配,没法处理时间的范围判断。可以用awk结合时间戳来完成,具体操作如下:

步骤1:获取目标时间范围的时间戳

先把起止时间转换成Unix时间戳(从1970年到该时间的秒数),在终端执行以下命令:

# 起始时间2022-10-12 16:00:00的时间戳
start_ts=$(date -d "2022-10-12 16:00:00" +%s)
# 结束时间2022-10-13 18:00:00的时间戳
end_ts=$(date -d "2022-10-13 18:00:00" +%s)

步骤2:用awk筛选日志

假设你的日志文件名为filter.log,执行以下命令:

awk -v start="$start_ts" -v end="$end_ts" '{
    # 提取日志中的时间字段,拼接成date命令可识别的格式
    log_time = $1 " " $2 " " $3 " " $4
    # 将日志时间转换为时间戳
    cmd = "date -d \"" log_time "\" +%s"
    cmd | getline log_ts
    close(cmd)
    # 判断时间是否在范围内,且包含目标IP
    if (log_ts >= start && log_ts <= end && $0 ~ /192\.168\.1\.1/) {
        print $0
    }
}' filter.log

简化版直接执行命令

如果你不想分步定义变量,可直接把计算好的时间戳写死到命令中(先自行用date命令算出起止时间的时间戳):

awk '{
    log_time = $1 " " $2 " " $3 " " $4
    cmd = "date -d \"" log_time "\" +%s"
    cmd | getline log_ts
    close(cmd)
    if (log_ts >= 1665571200 && log_ts <= 1665667200 && $0 ~ /192\.168\.1\.1/) {
        print $0
    }
}' filter.log

执行后就能得到你期望的结果:

Oct 13 2022 17:00:00 AriaDezh filterlog: 1055<1>,83,,,0,lo0,match,pass,out,4,0x0,,64,0,0,DF,6,tcp,60,192.168.1.1,127.0.0.1,50191,14382,0,S,1420028472,,65228,,mss;nop;wscale;sackOK;TS

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:10:33