如何在某个时间范围内 grep httpd error_log?

如何在某个时间范围内 grep httpd error_log?

error_log我怎样才能根据时间范围从一个巨大的(120GB)的httpd中只grep行,比如:

from 2011-11-15 11:30 pm
to   2011-11-16 01:30 am

谢谢!

答案1

您可能需要进行一些深入研究,我首先会获取日期范围:

grep -e "2011\-11\-[15-16] " error_log > filtered
grep -v -e "2011\-11\-15 [0-10]:" | grep -v -e "2011\-11\-15 11:[0-29]" > filtered
grep -v -e "2011\-11\-16 [2-23]:" | grep -v -e "2011\-11\-16 01:[31-59]" > filtered

cat filtered

我能想到但还没有做过的最有效的方法是找到日期范围的开始和结束字节并获取它;(这显然可以通过 grep 实现)但我不知道如何从文件中获取一系列字节 - 可能需要一些 awk 技能

编辑:因为这是一个有趣的问题 - 我做了更多的挖掘:

您可以通过执行以下操作获取第一个字节偏移量:

 # Get first byte offset, leftmost number is the offset...
grep -m 1 -b "2011-11-15 11:3" error_log
 # Get last byte offset
grep -m 1 -b "2011-11-16 01:3" error_log

 #(Subtract first number from last number to get byte length) Then do:

dd if=error_log of=filtered bs=c skip=<first number> count=<last_byte#-first_byte#>

答案2

awk'$3>“11:30:00”&&$3<“13:30:00”'日志文件|较少

其中 $3 是日志文件的第 3 列,即时间戳,您可以根据日志文件使用任意数字。

答案3

如果有人想在特定时间范围内获取日志,也许你想在 5 分钟内获取日志,你可以像下面这样

对于动态时间范围(例如,您不知道时间范围,但需要过去 5 分钟之间的日志)

#!/bin/bash
LOG_FILE="./modsec.txt"
SEARCH_WORD="ModSecurity: Access denied"
START_TIME=$(date -d "5 minutes ago" "+%H:%M")
END_TIME=$(date "+%H:%M")

# using sed
sed -n "/"$START_TIME"/,/"$CURRENT_TIME"/p" "$LOG_FILE" | grep -w "$SEARCH_WORD"

对于静态时间范围(您知道时间范围)

sed -n "/hh:mm/,/hh:mm/p" "$LOG_FILE" | grep -w "$SEARCH_WORD" (您可以根据您的时间戳替换时间范围)

相关内容