前言

  借助二分法能够快速匹配时间戳,根据时间戳来找出需要查找的日志内容。

  查找前提条件:

    1 因为是二分法特性,所以日志的时间必须是按从小到大或者从大到小的顺序排列。

    2 根据查找需要,修改匹配时间戳。

    3 根据不同的时间戳格式,修改对应的代码。

  1 import os
  2 import time
  3 import sys
  4
  5 class SearchLog(object):
  6
  7     def __init__(self, file_name='./log.txt'):      
  8         self.fp = open(file_name)             
  9         self.fp.seek(0, os.SEEK_END)      #把指针移动到结尾
 10         self.size = self.fp.tell()       #tell()方法能够告诉我们文件的大小
 11         self.fp.seek(0, os.SEEK_SET)      #吧指针移动到文件内容的开头
 12
 13     def Search_cmp(self, timestamp, line):      #定义一个匹配时间戳的方法
 14         tmp = line.split(' ')          
 15         riqi=tmp[0]
 16         shijian=tmp[1]
 17         realtime=riqi+' '+shijian                  #在这里可以修改要匹配的时间戳格式
 18         #print realtime
 19         return cmp(timestamp, realtime)          #cmp函数用于比较二者是否相同,如果返回为-1,那么就说明timestamp>realtime,如果等于0,那么两者相等。
 20
 21
 22     def Search_LineHead(self):              #定义一个匹配每行开头的方法
 23
 24         while self.fp.tell() > 0:             
 25             self.fp.seek(-1, os.SEEK_CUR)        #把文件内容的指针在当前位置往前挪一位
 26             val = self.fp.read(1)             # 读取该指针位置的内容
 27             if val == '\n':                 #匹配该指针内容的值是否等于换行符,等于就跳出循环
 28                 break  
 29             self.fp.seek(-1, os.SEEK_CUR)        #不等于就就继续往前挪一位查找
 30
 31     def Search_TimeStamp(self, timestamp, start_p = 0):
 32
 33         fp_start = start_p
 34         fp_end = self.size
 35
 36         while fp_start < fp_end:              #判断指针开始位置是否小于结束位置
 37             mid = fp_start + (fp_end-fp_start)/2     #找出中间值(利用二分法)
 38             self.fp.seek(mid, os.SEEK_SET)        #通过seek定位到中间值
 39             self.Search_LineHead()            
 40             line = self.fp.readline()
 41             val = self.Search_cmp(timestamp, line)      #调用该方法能够匹配时间戳,返回值为0那么就说明找到了时间戳
 42             if val == 0:          
 43                 print "find timestamp:%s" % line
 44                 return True
 45             elif val == 1:
 46                 fp_start = self.fp.tell()          #如果等于1,说明当前内容的时间戳比输入的时间戳大
 47             else:
 48                 fp_end = mid                  #如果等于其他的,说明当前内容的时间戳比输入的时间戳小,
 49         return False
 50
 51     def Search_FirstStamp(self, timestamp, start_p = 0):
 52
 53         first_point = -1
 54         val = self.Search_TimeStamp(timestamp, start_p)
 55
 56         if val == True:
 57             point = self.fp.tell()                #这里的逻辑是这样的==>
 58             while point > 0:                    #如果search_timestamp这个方法匹配到了时间戳,并且指针恒大于0的话,指针就在当前位置往前挪,直到匹配到换行符,再把这行通过readlie()方法整行独取出来。
 59                 self.fp.seek(-1, os.SEEK_CUR)          #此时再去匹配每行的开头是否等于时间戳,如果等于的话,那么就把指针从文件内容开头移动到匹配到时间戳的这行,标记这行为要查找的时间戳出现的第一行。
 60                 self.Search_LineHead()                  
 61                 point = self.fp.tell()                      
 62                 line = self.fp.readline()
 63                 print line
 64                 if line.startswith(timestamp) == True:
 65                     self.fp.seek(point, os.SEEK_SET)
 66                     continue
 67                 first_point = self.fp.tell()
 68                 break
 69
 70         return first_point
 71
 72     def Search_EndStamp(self, timestamp, start_p = 0):
 73
 74         last_point = -1
 75         val = self.Search_TimeStamp(timestamp, start_p)
 76         if val == True:                        #道理同上,不过这个的就反转过来,用来查找要查找的时间戳的最后一行。
 77             last_point = self.fp.tell()
 78             while last_point < self.size:
 79                 line = self.fp.readline()
 80                 if line.startswith(timestamp) == True:
 81                     last_point = self.fp.tell()
 82                     continue
 83                 print line
 84                 self.fp.seek(last_point, os.SEEK_SET)
 85                 break
 86
 87             return last_point
 88
 89     def Search_Dump(self, s_p, e_p):                  #把查找到的内容写入日志
 90         self.fp.seek(s_p, os.SEEK_SET)
 91         f_log=open('search_err.log','wb')
 92         while self.fp.tell() < e_p:
 93             print self.fp.readline()
 94             f_log.write(self.fp.readline())
 95         f_log.close()
 96
 97     def Search_DeInit(self):
 98         self.fp.close()
 99
100 if __name__ == '__main__':
101     time_s = time.time()
102     obj = SearchLog(sys.argv[3])
103     s_point = obj.Search_FirstStamp(sys.argv[1])
104     if s_point > -1:
105         e_point = obj.Search_EndStamp(sys.argv[2], s_point)
106     if s_point > -1:
107         print s_point , e_point
108         obj.Search_Dump(s_point, e_point)
109     else:
110         print "not find"
111     print time_s, time.time()
112
113     obj.Search_DeInit()

借助二分法匹配时间戳实现快速查找日志内容相关推荐

  1. 如何快速查看日志内容

    一.cat 选项与参数: -A :相当于-vET的整合,可列出一些特殊字符而不是空白而已: -b :列出行号,仅针对非空白行做出行号显示,空白行不标行号: -E :将结尾的换行符$显示出来: -n : ...

  2. python二分法查找时间点_python有序查找算法:二分法

    二分法是一种快速查找的方法,时间复杂度低,逻辑简单易懂,总的来说就是不断的除以2除以2... 但是需要注意:待查找的序列区间单调有序 例如需要查找有序数组arr里面的某个关键字key的位置,那么首先确 ...

  3. sublime快捷键:快速查找函数和快速匹配括号

    1. 快速查找函数 Ctrl+R 2. 快速匹配括号 光标置于括号中,Ctrl+Shift+M 快速匹配括号内容,再按下 Ctrl+Shift+[ 折叠代码, Ctrl+Shift+] 展开代码. 3 ...

  4. 快速搭建日志系统——ELK STACK

    什么是ELK STACK ELK Stack是Elasticserach.Logstash.Kibana三种工具组合而成的一个日志解决方案.ELK可以将我们的系统日志.访问日志.运行日志.错误日志等进 ...

  5. 快速了解日志概貌,详细解读13种日志模式解析算法

    云智慧 AIOps 社区是由云智慧发起,针对运维业务场景,提供算法.算力.数据集整体的服务体系及智能运维业务场景的解决方案交流社区.该社区致力于传播 AIOps 技术,旨在与各行业客户.用户.研究者和 ...

  6. List中根据对象字段快速查找对象

    import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import java.util. ...

  7. 基于Linux系统的快速查找方法

    1 引言 Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统.由于其多用.多任务特性,被广泛应用于服务器开发和嵌入式开发.在系统运行过程中,会产生了大量的信息,不管是日志 ...

  8. java快速查找算法_Java实现的快速查找算法示例

    本文实例讲述了Java实现的快速查找算法.分享给大家供大家参考,具体如下: 快速查找算法,可以根据想要找的是第几个大的数,每次循环都能固定下来一个数在数组完整排完序之后的位置,每次循环都能定一个数的位 ...

  9. linux查找日志技巧

    对于从事web开发的人员来说.服务器上的日志多如牛毛,如何快速从中找出所需信息非常重要,以下是我在工作中用到的查找日志的简单命令,希望能对您有所帮助: 工具/原料 linux SecureCRT 方法 ...

最新文章

  1. 如何成为软件工程师的团队合作者
  2. 塔式、机架式、刀片式服务器比较
  3. python【数据结构与算法】最小生成树之Kruskal算法
  4. Acwing第 27 场周赛【完结】
  5. 化工原理(过滤和沉淀)
  6. [转] Gmail 的Host解决方案
  7. 从Paxos到ZooKeeper-四、ZooKeeper技术内幕
  8. Php保护数据库连接信息,php连接数据库,哪里填自己的数据库信息啊,能⭕下吗?我乱填后总是服务器正在维护。代码如下...
  9. java设计模式学习3--Command Pattern[原创]
  10. CSDNamp;amp;《程序员》杂志创始人——蒋涛 推荐
  11. 台电 8G U盘通过量产程序实现USB-CDROM启动
  12. 飞飞键盘鼠标连点器v1.0绿色版
  13. 杭电oj基础题目(1106、1108、1163、1164、1170、1194、1197)
  14. spring mvc
  15. 测试工程师如何跟进用户反馈
  16. 怎么用计算机隐藏应用程序,win7 隐藏应用程序 电脑如何隐藏程序_win7教程_uc电脑园...
  17. 2022年推土机司机(建筑特殊工种)考试题库及推土机司机(建筑特殊工种)考试技巧
  18. Python(1)概述与基础
  19. opencv图片旋转90°/-90°/180°
  20. JAVA基础——基本类型

热门文章

  1. MyEclipse连接oracle9i:invalid or unknown NLS parameter value specified错误
  2. C++ string类中的find()函数的简单使用
  3. 一个关于linux文件预读机制问题
  4. GenericFactoryMethod泛型工厂模式实现简单IOC功能
  5. wgrib读grib数据
  6. linux 操作系统chgrp 的命令用法
  7. 解决linux ssh客户端SSH连接linux服务器很慢的问题
  8. (转) oc static extern 和const
  9. 记一次小的51CTO聚会
  10. 中国人必须知道的76个常识。。。看了才发现,自己知道的实在太少了。。。学习。。。。...