日志查找到第一个关键字后反向查找第二个关键字

用户的一个需求

catalina.out的日志中,先找到第一个关键字,然后向上查找第二个关键字,写个小脚本

 1 #!/usr/bin/python
 2
 3 import datetime, time
 4 import re
 5 import os
 6
 7 #取得文件名,文件名的时间格式是收到报警的时间减去一小时
 8 def get_filename(input_str):
 9     #如果有输入,整理格式后减去一小时
10     if input_str:
11         t=datetime.datetime.strptime(input_str, "%Y%m%d%H") + datetime.timedelta(hours=-1)
12     #如果无输入,则默认为现在时间再减去一小时
13     else:
14         t=datetime.datetime.now() + datetime.timedelta(hours=-1)
15     #组合成文件名
16     f_name="/app/tomcat/logs/catalina."+t.strftime("%Y-%m-%d-%H")+".out"
17     return f_name
18
19 #取得第一个关键字的行数
20 def get_line(f_name):
21     with open(f_name, ‘r‘) as fread:
22         lines = fread.readlines()
23         i=0
24         l_num=[]
25         for line in lines:
26             #第一个关键字
27             keyword1="Could not connect to SMTP host"
28             rs1 = re.search(keyword1, line)
29             i+=1
30             if rs1:
31                 #第一个关键字的行号
32                 l_num.append(i)
33     return l_num
34
35 #根据第一个关键字的行数向上查找到第二个关键字
36 def get_log(f_name, num):
37     with open(f_name, ‘r‘) as fread:
38         #把文件倒过来,从第一个关键字所在的行开始查找
39         rlines = fread.readlines()[::-1]
40         j=0
41         rs_str=[]
42         for j in range(len(rlines)-num,len(rlines)):
43             #第二个关键字的正则表达式
44             keyword2="U000\d{4},.*@.*,.\d{2}"
45             rs2 = re.search(keyword2, rlines[j])
46             j+=1
47             if rs2:
48                 #第二个关键字的内容,J由于上面+1了,所以要-1
49                 rs_str.append(rlines[j-1])
50                 break
51     return rs_str
52
53 def main():
54     #打印说明文字
55     print "Please input alerttime, YYYYMMDDHH exp:2017010113"
56     print "Enter for default (now)"
57     #要求输入
58     input_str = raw_input("input: ")
59     #取得文件名
60     f_name = get_filename(input_str)
61     #判断文件是否存在
62     if os.path.isfile(f_name):
63         l_num = get_line(f_name)
64         if l_num:
65             for num in l_num:
66                 rs_str=get_log(f_name, num)
67                 if rs_str:
68                     #找到日志时的输出
69                     print "-----------------"
70                     print rs_str[0]
71                     print "javax.mail.MessagingException: Could not connect to SMTP host: smtp.partner.outlook.cn, port: 587;"
72                     print "-----------------"
73         #未找到相关日志时的输出
74         else:
75             print "-----------------"
76             print "No Log Found"
77             print "-----------------"
78     #文件不存在时的输出
79     else:
80         print "-----------------"
81         print "File not exist, please check again"
82         print "-----------------"
83
84 if __name__ == ‘__main__‘:
85     main()

输出为

[[email protected] logs]# ./findlog.py
Please input alerttime, YYYYMMDDHH exp:2017010113
Enter for default (now)
input: 2017083116
-----------------
2017-08-31 15:00:16,070 DEBUG [java.sql.ResultSet] - {rset-187333} Result: [U0000448, [email protected], ??Buyer, 00]

javax.mail.MessagingException: Could not connect to SMTP host: smtp.partner.outlook.cn, port: 587;
-----------------
-----------------
2017-08-31 15:38:15,980 DEBUG [java.sql.ResultSet] - {rset-187333} Result: [U0000449, [email protected], ??Buyer, 00]

javax.mail.MessagingException: Could not connect to SMTP host: smtp.partner.outlook.cn, port: 587;
-----------------

  

时间: 2024-08-29 07:50:07

日志查找到第一个关键字后反向查找第二个关键字的相关文章

正向查找区域和反向查找区域的操作教程(内提供系统镜像下载)

这篇跟大家分享正反向查找区域的操作.系统镜像下载链接:https://pan.baidu.com/s/114IKLwYoDFtI3vOnudmV9Q首先大家准备一个Windows server版本的服务器,自行安装好系统安装好后打开[服务器管理器]找到[管理]并点击[添加角色功能]点击下一步,下一步,下一步点添加DNS服务器一直下一步,选择安装在[服务器管理器]中点开[工具]并点开[DNC]右键[正向查找区域]点新建区域下一步选择[主要区域]区域名称输入baidu.com(名称随便输入格式不能错

数据结构(三)之单链表反向查找

一.反向查找单链表 1.简单查找 先遍历获取单链表单长度n,然后通过计算得到倒数第k个元素的下标为n-k,然后查找下标为n-k的元素. 2.优化查找 先找到下标为k的元素为记录点p1,然后设置新的记录点p2的下标从0开始,同时遍历两个记录点,直到p1的值为null,p2是倒数第k个元素. 单链表结点: package cn.edu.scau.mk; /** * * @author MK * @param <T> */ public class Node<T> { private T

scala移除一个数组中第一个负数后的所有负数

2016 年1月1日 王老师课堂笔记和作业 笔记:王老师主要讲解了spark的发展前景,spark在未来的几十年里必将一统大数据江湖.graphx,mllib,sparkSQL (1)scala语法的基础知识,重点为函数式编程思想. (2)spark源代码查看. 作业描述: 移除一个数组中第一个负数后的所有负数 object Except { def main(args: Array[String]) { val arr = Array(0,2,-3,1,2,3,-3,-6,-7); var f

二分查找、二分查找大于等于key的第一个元素、二分查找小于等于key的最后一个元素

二分查找很简单,二分查找的变形需要注意一些细节. 1.当找大于等于key的第一个元素,或者查找小于等于key的最后一个元素时, 循环条件是 low < high,这和基本的二分查找不同, 但需要在循环退出的时候,判断是否满足条件: 2.如果是找最后一个满足条件的情况, 下限移动时不能用 low=mid+1:而应该用 low=mid: 此时,mid计算时应该用 mid=(low+high+1)/2, 保证 最后low.high相差1时不会陷入死循环, 循环退出后,下限可能是结果: 3.如果是找第一

JavaSE8基础 String lastIndexOf 反向查找 返回字符在字符串中第一次出现时的索引值

os :windows7 x64    jdk:jdk-8u131-windows-x64    ide:Eclipse Oxygen Release (4.7.0)        code: package jizuiku.t00; public class Dome3 { public static void main(String[] args) { // 索引值 // 10 // 11 // 12 // 13 // 0123456789 String str = "abc01234543

Android Studio keymap到Eclipse后,查找下一个相同变量快捷键Ctrl+K失效

Android Studio在设置完Keymap到Eclipse后,原来Eclipse有一个很好使的快捷键Ctrl+K不灵了,在Eclipse中,你只要 选中一个变量,然后Ctrl+K,光标就会自动定位到下一个变量被使用的地方,这个快捷键的名称其实就是"Find+Next". 那为啥我都设置Keymap到Eclipse了,然后打开快捷键界面,看到"Find+Next"的快捷键就是Ctrl+K,为啥选中变量后, 狂Ctrl+K就是不给响应.具体的原因我在另外一篇文章:

面试题之在字符串中查找出第一个只出现一次的字符的位置

样例:比如“abcdabc”,第一个只出现一次的字符为d,位置为3 解决方案1:O(n*n)的复杂度 遍历字符串中的每个字符,然后用该字符在字符串中进行查找,如果没有找到和当前字符相同的字符.则当前字符为第一个 只出现一次的字符. 解决方案2:O(n)的复杂度 采取空间换时间的策略 开一个辅助数组,做哈希映射 第一次扫描时,更新在辅助数组中当前字符出现的次数. hash查找的时间复杂度为o(1). 第二次扫描时,在辅助数组中通过查辅助数组看当前字符是否只出现了一次,从头到尾的顺序遍历保证了“第一

浅谈算法和数据结构: 七 二叉查找树 八 平衡查找树之2-3树 九 平衡查找树之红黑树 十 平衡查找树之B树

http://www.cnblogs.com/yangecnu/p/Introduce-Binary-Search-Tree.html 前文介绍了符号表的两种实现,无序链表和有序数组,无序链表在插入的时候具有较高的灵活性,而有序数组在查找时具有较高的效率,本文介绍的二叉查找树(Binary Search Tree,BST)这一数据结构综合了以上两种数据结构的优点. 二叉查找树具有很高的灵活性,对其优化可以生成平衡二叉树,红黑树等高效的查找和插入数据结构,后文会一一介绍. 一 定义 二叉查找树(B

找到一段话中第二个关键字的位置

namespace  找到一段话中第二个关键字的位置 {    class Program    {        static void Main(string[] args)        {     //找第二个a            string s = "cabcaceadf";            int n = s.IndexOf("a");  //找到第一个a的索引n            string x = s.Substring(n+1);