【问题标题】:How do I run grep command for a range of inputs?如何为一系列输入运行 grep 命令?
【发布时间】:2017-08-30 21:04:41
【问题描述】:

我需要以下 grep 命令来查找日志中每小时收到多少请求:

grep 'login log' filelog.txt | grep -c '2017-08-30 ":00 to :23"'

这里是 00 到 23 小时,我需要作为参数传递。例如,对于日期 30,我需要查看每小时的计数。

是否可以使用单个命令?目前,我必须每小时手动执行一个命令。例如,

$grep 'login log' filelog.txt | grep -c '2017-08-30 :00'
123
$grep 'login log' filelog.txt | grep -c '2017-08-30 :01'
456

这里是文件中的日志行,我想根据时间每小时计算一次(第二列):

2017-08-30 20:19:47 INFO  com.java.JavaFile:123 - login log  abcduser

【问题讨论】:

  • 能否重写问题,并提供一些示例数据?我不知道你想达到什么目的。
  • 谢谢,我用示例日志行更新了问题
  • 所以你的第一个 grep 永远不会匹配?
  • 您的 grep 搜索 login log,但这不是您的日志示例的一部分。你的意思是user login
  • 谢谢,我更正了

标签: linux bash shell unix


【解决方案1】:
grep "yourstring" filelog.txt |
   grep -Eo "^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}" | sort | uniq -c

【讨论】:

  • 谢谢@Walter,你太棒了:)
【解决方案2】:

所以,言出必行:

您的输入(为测试而增强):

cat filelog.txt
2017-08-30 20:19:47 INFO  com.java.JavaFile:123 - user login  abcduser
2017-08-30 20:29:47 INFO  com.java.JavaFile:123 - user login  abcduser
2017-08-30 21:17:47 INFO  com.java.JavaFile:123 - user login  abcduser
2017-08-30 21:19:47 INFO  com.java.JavaFile:123 - user login  abcduser

想要的结果?打印小时和匹配数:

awk '/login/ {a[gensub(/(..):.*/,"\\1",1,$2)]++;b[gensub(/(..):.*/,"\\1",1,$2)]=gensub(/(..):.*/,"\\1",1,$2)} END{n=asorti(a,s); for(i=1;i<=n;i++){print b[s[i]]"\t"a[s[i]]}}' filelog.txt
20  2
21  2

【讨论】:

  • 这对我来说很好,只是结果不是按小时排序的:)
  • 简单修复:) ...让我修改答案
猜你喜欢
  • 2018-05-02
  • 1970-01-01
  • 2014-06-07
  • 2019-04-07
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多