我有一个这种格式的日志文件:
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,'