如何过滤掉python中两个时间戳之间的行

时间:2014-04-11 12:15:49

标签: python regex

我有以下问题,我有一个日志文件,我想逐行阅读,但减少我想要过滤掉两个时间戳之间的行!

awk中的示例:

find all between two patterns: pattern1 = 2012-10-23 14, pattern2 = 2012-10-23 16
awk '/2012-10-23 14/{P=1;next}/2012-10-23 16/{exit} P' server.log

或使用egrep和一种模式:

egrep "2012-10-23 (1[4-6]:[0-5][0-9])" server.log

上面的awk行只会给我这两个时间戳之间的界限。

如何在不执行任何系统命令或awk,grep ...的情况下在python中执行此操作,但只能使用python正则表达式

先谢谢。

2 个答案:

答案 0 :(得分:0)

您的awk代码中的一对一翻译:

with open('yourFile') as f:
    lines = f.read().splitlines()

for l in lines:
    if l.startswith('2012-10-23 14'):
        p=1
    elif l.startswith('2012-10-23 16'):
        p=0
        break
    if p: print l

这将在以2012-10-23 14 ...开头的第一行匹配时开始输出,并在以2012-10-23 16..开头的第一行匹配时停止打印。 (与您的awk代码相同)

答案 1 :(得分:0)

我认为@Kent帖子只有在我们假设时间戳位于您行的开头时才会起作用。使用AWK / egrep代码,您需要更通用的东西。

以下代码应该有效:

  • 独立于行内搜索模式的位置
  • 独立于日志中的行是否正确排序(尽管这是非常可以假设的;-))
  • 作为非阻塞生成器,在没有不必要的内存分配的情况下处理它们时产生结果。
  • 具有更多通用代码构造,以防您需要进一步修改。

    import re 
    
    def log_lines(yourFile, regexp):
      rxp = re.compile(regexp)
      with open(yourFile) as f:
        for line in f.readlines():
          if rxp.search(line): 
            yield line
    
    for line in log_lines("yourFile", "2012-10-23 1[4-6]"):
       print line
    

坚持使用python,它很容易上瘾; - )

相关问题