首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >grep在条件下是如何计算的

grep在条件下是如何计算的
EN

Stack Overflow用户
提问于 2022-08-13 16:38:34
回答 2查看 78关注 0票数 0

我有这个字符串的日志文件

代码语言:javascript
复制
2022-08-13 19:15:17.170 INFO 550034 --- [ scheduling-3] org.hibernate.SQL_SLOW : SlowQuery: 11387 milliseconds. SQL:

我需要grep命令来计算最后一小时的slowQuery,时间超过10000 ms。

我试过了

代码语言:javascript
复制
grep "SQL_SLOW" app.log | wc -l

但我不能附加两个条件:

  1. 时间(前19个符号)必须介于当前时间-1小时
  2. 时间之间,查询时间必须大于10000 ms (例如,它是11387 ms)
EN

回答 2

Stack Overflow用户

发布于 2022-08-13 20:39:17

grep是工作的错误工具;试图通过RE获得匹配的日期和时间条件是错误的。

awk怎么样?

代码语言:javascript
复制
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}。如果两者均为真,则打印这一行。

票数 2
EN

Stack Overflow用户

发布于 2022-08-14 08:29:41

有人帮我找到了这个解决方案。但也有一些招供。日志不完全是最后一个小时,而是当前不完整的小时和前一个小时(也就是说,取决于当前时间,它将从1小时到2小时)。

代码语言:javascript
复制
grep "SQL_SLOW" "app.log" \
| grep "^$(date -d '1 hour ago' '+%Y-%m-%d %H')" \
| grep -P "SlowQuery: \d{5,} milliseconds" \
| wc -l

但是使用awk的解决方案看起来更好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73346036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档