如何为一系列输入运行grep命令?

时间:2017-08-30 21:04:42

标签: linux bash shell unix

我需要以下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

2 个答案:

答案 0 :(得分:1)

grep "yourstring" filelog.txt |
   grep -Eo "^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}" | sort | uniq -c

答案 1 :(得分:1)

所以,按照你所说的而不是你所做的去做:

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

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