Bash grep表示时间戳和单词
因此,我试图grep通过一个日志文件,其中包含一个时间戳(在过去30分钟内)和一个单词。 我有查找时间戳的工作代码: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 "^$(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的行数