使用grep过滤日志

时间:2017-02-27 15:05:30

标签: unix filter grep

我试图过滤日志文件中其他用户调用服务的次数。

我在考虑使用uniq -c,但由于时间戳,几乎所有线路都是独一无二的。我想要的是忽略我不需要的部分线路,只关注服务名称和识别每个单独呼叫的呼叫ID。

日志格式如下:

27/02/2017 00:00:00 [useremail@email.com] [sessioninfo(**callId**)] **serviceName**

将callId和serviceName作为我想要过滤的字符串。

我所需的输出将是与服务调用在同一行中找到的每个不同callId的计数。

例如输入:

27/02/2017 00:00:00 [useremail@email.com] [sessioninfo(12345)] service1
27/02/2017 00:00:01 [useremail1@email.com] [sessioninfo(12346)] service1
27/02/2017 00:00:02 [useremail2@email.com] [sessioninfo(12347)] service1
27/02/2017 00:00:00 [useremail@email.com] [sessioninfo(12345)] service1

输出为3,因为其中一行使用相同的callId。

有什么方法可以用grep实现这个目的,还是我需要创建更高级的脚本来完成这项工作?

2 个答案:

答案 0 :(得分:1)

您可以使用以下awk:

awk -F '[\\(\\)\\]]+' '{ print $3 " " $4 }' somelog.log

您可以稍后将其与sort和uniq组合并获取计数:

awk -F '[\\(\\)\\]]+' '{ print $3 " " $4 }' somelog.log | sort | uniq

答案 1 :(得分:1)

  

我想要的是忽略我不需要的部分。

在您的情况下,您需要的是-f uniq 选项:

 -f num  Ignore the first num  fields in each input line when doing comparisons.  A
         field is a  string of non-blank characters separated  from adjacent fields 
         by blanks. Field numbers are one based, i.e., the first field is field one.

所以你要sort日志文件,用uniq -f3找到唯一的行(折扣前三个字段),然后用wc -l找到这些行的数量。

sort out.log | uniq -f 3 | wc -l