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
相关产品推荐
相关产品推荐

