如何在Python中筛选两个时间戳之间的行

1 投票
2 回答
1355 浏览
提问于 2025-04-18 02:20

我遇到了一个问题,我有一个日志文件,想要逐行读取,但为了减少行数,我想过滤掉两个时间戳之间的行!

在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代码会让我只得到这两个时间戳之间的行。

我该如何在Python中做到这一点,而不执行任何系统命令或使用awk、grep等,只用Python的正则表达式呢?

提前谢谢!

2 个回答

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吧,它会让你上瘾的 ;-)

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 代码效果一样)

撰写回答