Bash grep表示时间戳和单词

Bash grep表示时间戳和单词,bash,grep,Bash,Grep,因此,我试图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 jav

因此,我试图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"

代码的主要问题是,您正在
grep
ing查找正好在30分钟前的日期戳,而不是过去30分钟内的任何时间

通过将当前shell的日期(以秒为单位)作为变量传递,您可以使用Awk实现所需的功能。然后,您可以将日志中的日期戳转换为以秒为单位的日期,并从当前日期变量中减去该日期戳,以查看它是否在最近30分钟(1800秒)内

awk-v current=$(日期+%s)-v IGNORECASE=1-F\.'开始{
n=0
}
/^[0-9]{1,4}-[0-9]{1,2}-[0-9]{1,2}[0-9]{2}:[0-9]{2}:[0-9]{2}./&&&/exception/{
时间=$1
format=“\\1\\2\\3\\4\\5\\6”
秒=mktime(gensub(/(..)-(..)-(..)(..):(..)/,格式,“,时间))

如果((当前-秒)代码的主要问题是,您正在
grep
ing查找正好在30分钟前的日期戳,而不是过去30分钟内的任何时间

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

awk-v current=$(日期+%s)-v IGNORECASE=1-F\'开始{
n=0
}
/^[0-9]{1,4}-[0-9]{1,2}-[0-9]{1,2}[0-9]{2}:[0-9]{2}:[0-9]{2}./&&&/exception/{
时间=$1
format=“\\1\\2\\3\\4\\5\\6”
秒=mktime(gensub(/(..)-(..)-(..)(..):(..)/,格式,“,时间))

如果((当前-秒)代码的主要问题是,您正在
grep
ing查找正好在30分钟前的日期戳,而不是过去30分钟内的任何时间

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

awk-v current=$(日期+%s)-v IGNORECASE=1-F\'开始{
n=0
}
/^[0-9]{1,4}-[0-9]{1,2}-[0-9]{1,2}[0-9]{2}:[0-9]{2}:[0-9]{2}./&&&/exception/{
时间=$1
format=“\\1\\2\\3\\4\\5\\6”
秒=mktime(gensub(/(..)-(..)-(..)(..):(..)/,格式,“,时间))

如果((当前-秒)代码的主要问题是,您正在
grep
ing查找正好在30分钟前的日期戳,而不是过去30分钟内的任何时间

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

awk-v current=$(日期+%s)-v IGNORECASE=1-F\'开始{
n=0
}
/^[0-9]{1,4}-[0-9]{1,2}-[0-9]{1,2}[0-9]{2}:[0-9]{2}:[0-9]{2}./&&&/exception/{
时间=$1
format=“\\1\\2\\3\\4\\5\\6”
秒=mktime(gensub(/(..)-(..)-(..)(..):(..)/,格式,“,时间))

如果((当前-秒)继续你的工作,只需将
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解决方案似乎是解决约会问题的好方法。

继续你的约会,只需将
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解决方案似乎是解决约会问题的好方法。

继续你的约会,只需将
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解决方案似乎是解决约会问题的好方法。

继续你的约会,只需将
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解决方案似乎是解决日期问题的好方法。

只有当前分钟数大于30时,
日期
技巧才有效。@choroba-Huh我在实践中没有注意到这一点,但谢谢你。你对其他方法有什么建议吗?我可能会使用Perl。要获得第二行,请在调用之前删除
| wc-l
grep
第二次,然后重试。您正在使用
wc-l
@DavidC.Rankin将输出减少到一个数字。我应该同时执行grep,然后减少到一个数字?我希望符合时间戳并包含“异常”的行数,而不是行本身。我只是尝试获取一些匹配项。
日期
技巧只有在当前分钟数大于30时才有效。@choroba-Huh我在实践中没有注意到这一点,但谢谢你。你对其他方法有什么建议吗?我可能会使用Perl。要获得第二行,请在第二次调用
grep
之前删除
| wc-l
,然后重试。你正在将输出减少到一个数字使用
wc-l
@DavidC.Rankin可以。我应该同时使用greps,然后减少到一个数字?我想要的是符合时间戳并包含“异常”的行数,而不是行数本身。我只是想得到一些匹配项。
date
技巧只有在当前分钟数大于30时才有效。@choroba-Huh我没有注意到在实践中,这是一个问题,但谢谢你。你对其他方法有什么建议吗?我可能会使用Perl。要获得第二行,请删除
|wc-l
,然后再次调用
grep
,再试一次。使用
wc-l
@DavidC.Rankin可以将输出减少到一个数字。我应该同时执行greps和r导出到一个数字?我想要满足时间戳和c的行数