grep的时间戳和单词

时间:2014-08-07 23:04:36

标签: bash grep

所以我试图通过日志文件来计算包含最后30分钟内的时间戳和一个单词的行。 我有工作代码来查找时间戳:

grep "^$(date -d -30minute +'%Y-%m-%d %H')" /path/to/the/derp | wc -l

示例日志文件可以是:

2014-08-07 00:00:03.001 000 GoogleGeoCodeService blah blah blah
2014-08-07 00:00:01.001 000 carrier check java.net.SocketTimeoutException

如果两个条目都在过去半小时内出现,我如何计算第二行而不是第一行?我试过添加另一个管道,但我从来没有得到正确的结果:

grep "^$(date -d -30minute +'%Y-%m-%d %H')" /path/to/the/derp | wc -l | grep -i "exception"

2 个答案:

答案 0 :(得分:2)

您的代码存在的主要问题是,您需要grep注明30分钟前的日期戳,而不是过去30分钟内的任何时间。

您可以通过将当前shell的日期(以秒为单位)作为变量传递来完成您想要的Awk。然后,您可以将日志中的日期戳以秒为单位转换为日期,并从当前日期变量中减去该日期戳,以查看它是否在过去30分钟(1800秒)内。

awk -v current=$(date +%s) -v IGNORECASE=1 -F\. 'BEGIN {
    n=0
}
/^[0-9]{1,4}-[0-9]{1,2}-[0-9]{1,2} [0-9]{2}:[0-9]{2}:[0-9]{2}./ && /exception/ {
    time=$1
    format="\\1 \\2 \\3 \\4 \\5 \\6"
    seconds=mktime(gensub(/(....)-(..)-(..) (..):(..):(..)/, format, "", time))
    if((current - seconds) <= 1800)
        n++
}END{
    print n
}' /path/to/the/derp

答案 1 :(得分:1)

继续你所拥有的,只需将wc移到最后:

grep "^$(date -d -30minute +'%Y-%m-%d %H')" /path/to/the/derp |
  grep -i "exception" |
  wc -l

但实际上这可以简化:

grep -ic "^$(date -d -30minute +'%Y-%m-%d %H').*exception" /path/to/the/derp

虽然awk解决方案似乎是解决日期问题的好方法。