【问题标题】:Grep a word and find its Count from log file for different timesGrep 一个单词并从不同时间的日志文件中找到它的计数
【发布时间】:2014-11-21 06:28:49
【问题描述】:

包含以下数据的日志文件。

2014-10-19 17:30:25:
Creating destination directory: "\master1\users\jamesk\Java\chapter05\tech-support-complete\doc\" 
Loading source file Error \\master1\users\jamesk\Java\chapter05\tech-support-complete\JamesKohout.java... 
onstructing Javadoc information...Error
31 Error Standard Doclet version 1.6.0_26 Error
-encoding Error
19 windows-1252 
20 -charset Error
21 windows-1252 
22 -docletpath 
2014-10-19 18:30:25:
Creating destination directory: "\master1\users\jamesk\Java\chapter05\tech-support-complete\doc\" 
Loading source file Error \\master1\users\jamesk\Java\chapter05\tech-support-complete\JamesKohout.java... 
onstructing Javadoc Error information...
31 Standard Doclet version 1.6.0_26 Error
-encoding Error
19 windows-1252 
20 -charset Error
21 windows-1252 
22 -docletpath 
2014-10-19 19:30:25:
Creating destination directory: "\master1\users\jamesk\Java\chapter05\tech-support-complete\doc\" 
Loading source file Error \\master1\users\jamesk\Java\chapter05\tech-support-complete\JamesKohout.java... 
onstructing Javadoc information...Error
31 Standard Doclet version 1.6.0_26 Error
-encoding 
19 windows-1252 
20 -charset Error
21 windows-1252 
22 -docletpath 
2014-10-19 20:30:25:
Creating destination directory:Error "\master1\users\jamesk\Java\chapter05\tech-support-complete\doc\" 
Loading source file Error \\master1\users\jamesk\Java\chapter05\tech-support-complete\JamesKohout.java... 
onstructing Javadoc information...
31 Standard Doclet version 1.6.0_26 Error
-encoding Error
19 windows-1252 
20 -charset Error
21 windows-1252 Error
22 Error -docletpath

我想在 Unix/python 中编写一个脚本,该脚本 greps 单词“Error”并在不同时间从上面的日志文件中找到它的字数。 该文件包含不同时间间隔的数据。单词 Error 在第一个时间间隔的计数为 6,在第二个时间间隔的计数为 5,依此类推。 我希望输出为

2014-10-19 17:30:25:     Error Count=6
2014-10-19 18:30:25:     Error Count=5
2014-10-19 19:30:25:     Error Count=4
2014-10-19 20:30:25:     Error Count=7

我尝试使用以下命令,但它只给出了整个文件中的总字数。

grep -i "Error" | wc -l

请帮忙。 谢谢。

【问题讨论】:

  • 所以您无法检测时间?
  • 是的,我无法在不同时间单独找到字数。
  • @Rohit 检查代码

标签: python shell unix count


【解决方案1】:
import re
pattern=re.compile(r"\d{4}-\d{1,2}-\d{1,2}\s+\d{1,2}:\d{1,2}:\d{1,2}:|Error",re.IGNORECASE)
ll=pattern.findall(x)
d={}
for x in ll:
    if x!="Error":
        d[x]=0
        last=x
    else:
        d[last]=d[last]+1
print d

这里的 x 是你的数据或 file.read()。

【讨论】:

  • 如果我是正确的,x 是 "".join(file.readlines())。但这有效 + 1
【解决方案2】:

使用 Awk 的简单工作。

awk '/^[0-9][0-9][0-9][0-9]-[01][0-9]-[0-3][0-9] [012][0-9]:[0-5][0-9]:[0-6][0-9]:/ {
       t=$0 }
    /Error/ { ++e[t] }
    END { for (s in e) print s "Error-Count=" e[s] }' logfile

【讨论】:

  • awk 是一门优美的语言。
【解决方案3】:

直接awk

awk '/^201[0-9].*:/{if (cont){print cont}cont=0;printf $0}/Error/{cont+=1}END{print cont}' infile

解释code

awk '/^201[0-9].*:/{ # Timestamp pattern reached
                    if (cont){
                              print cont # print previus timestamp
                             }           # counter if exists and not zero
                    cont=0 # initialize actual timestamp counter 
                    printf $0
                   } #  print timestamp WITHOUT linebreak
            /Error/{ # Error patter reached
                    cont+=1 # Aaccumulated count
                   }
     END{
        print cont # print remainder counter
        }' infile

【讨论】:

  • 打印cont 的任何先前值,打印时间戳,开始将错误计数收集到cont(可能应该是count?)
  • 就是这样@tripleee ;)
【解决方案4】:

在这里你可以使用 python:

>>> f = open('logfile').readlines()
>>> i = 0
>>> while True:
...     if i+10 > len(f):
...        break
...     tmp = len(re.findall('Error',"".join(f[i+1:i+10])))
...     print f[i].strip() + " Error-Count=" + str(tmp)
...     i +=10
... 
2014-10-19 17:30:25: Error-Count=6
2014-10-19 18:30:25: Error-Count=5
2014-10-19 19:30:25: Error-Count=4
2014-10-19 20:30:25: Error-Count=7

【讨论】:

  • 如果时间戳之间的行数不同怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-05
  • 2021-05-09
  • 1970-01-01
  • 1970-01-01
  • 2017-03-24
  • 2014-04-29
  • 1970-01-01
相关资源
最近更新 更多