我有这个字符串的日志文件
2022-08-13 19:15:17.170 INFO 550034 --- [ scheduling-3] org.hibernate.SQL_SLOW : SlowQuery: 11387 milliseconds. SQL:我需要grep命令来计算最后一小时的slowQuery,时间超过10000 ms。
我试过了
grep "SQL_SLOW" app.log | wc -l但我不能附加两个条件:
发布于 2022-08-13 20:39:17
grep是工作的错误工具;试图通过RE获得匹配的日期和时间条件是错误的。
awk怎么样?
echo '2022-08-13 19:15:17.170 INFO 550034 --- [ scheduling-3] org.hibernate.SQL_SLOW : SlowQuery: 11387 milliseconds. SQL:' \
| awk -v now=$(date "+%s") '
/SlowQuery:/ {
tmp = "\" " $1 " " $2 "\""
cmd = "date -d " tmp " +%s"
cmd | getline ts
t = gensub(/.*SlowQuery: ([0-9]+) milliseconds.*/, "\\1", "g", $0)
if (now - ts < 3600 && t > 10000) {
print $0
}
}简要说明:首先,我们以秒为单位捕捉自时代以来的当前时间。
然后,我们将包含/SlowQuery:/的日志中的每行时间戳转换为自tmp="\x22 "$1" "$2"\x22";cmd="date -d " tmp " +%s";cmd|getline ts时代以来的秒数,并将其存储在变量ts中。
我们提取t=gensub(/.*SlowQuery: ([0-9]+) milliseconds.*/, "\\1", "g")所需的时间并将其存储在t中。
最后一步是检查是否已经过了不到一个小时,并且查询速度低于10000 ms if(ts-now<3600 && t>10000){print $0}。如果两者均为真,则打印这一行。
发布于 2022-08-14 08:29:41
有人帮我找到了这个解决方案。但也有一些招供。日志不完全是最后一个小时,而是当前不完整的小时和前一个小时(也就是说,取决于当前时间,它将从1小时到2小时)。
grep "SQL_SLOW" "app.log" \
| grep "^$(date -d '1 hour ago' '+%Y-%m-%d %H')" \
| grep -P "SlowQuery: \d{5,} milliseconds" \
| wc -l但是使用awk的解决方案看起来更好。
https://stackoverflow.com/questions/73346036
复制相似问题