如何使用字符串 grep 特定时间段内的日志文件

如何使用字符串 grep 特定时间段内的日志文件

我有一个这种格式的日志文件:

2016-01-21 01:56:48,586 [http-nio-8320-exec-54] INFO  config.web.login  - Successful login. Username: XYZ, xxxxx

我如何 grep 此文件并仅获取时间在 1:50:00 和 1:56:00 之间且config.web.login - Successful login. Username: XYZ存在字符串的行?我正在尝试计算某个用户名的成功登录次数。

答案1

您可以在 awk 和 grep 的帮助下完成此操作。

试试这个代码:

awk '/01:50:48/, /01:56:48/' <<FILENAME>> | grep 'Successful login. Username: XYZ,\s\+xxxxx'

其中 /01:50:00/ 是开始时间,/01:56:00/ 是停止时间。将 << FILENAME>> 替换为您的日志文件的路径。

答案2

如果有人想在特定时间范围内获取日志,也许你想在 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" (您可以根据您的时间戳替换时间范围)

答案3

我假设您仅对示例中显示的日期 2016-01-21 的 01:50:00 至 01:56:00 时间范围感兴趣。

以下是仅使用 grep 的解决方案:

$ egrep '^2016-01-21 01:(56:00|5[0-5]:[0-5][0-9]).*[[:blank:]]config.web.login  - Successful login. Username: XYZ,'

相关内容