经常需要在 binlog 中查找一些日志信息,于是写了一个简单的脚本。对于非常巨大的 binlog 文件,该脚本可能会速度慢,毕竟还是用的 list,暂时没想到好办法。

详细看代码:

#/usr/bin/python

#2016-04-12

#search string in the binlogs

#usage:
#put this file into binlog-dir,exec as:
#"python test.py 111 123 update" or
#"python test.py 111 123 update and insert" or
#"python test.py 111 123 update or delete"
#the nums are the binlog-num. import sys
import subprocess def find_str(files):
for file in files:
comm = "mysqlbinlog {0}".format(file)
lines = subprocess.Popen(comm, shell=True, stdout=subprocess.PIPE)
lines = lines.stdout.readlines()
for line in lines:
line = line.lower()
if len(sys.argv) == 4:
if sys.argv[3] + ' ' in line:
yield line
elif len(sys.argv) == 6 and sys.argv[4] == "and":
if sys.argv[3] + ' ' in line and sys.argv[5] + ' ' in line:
yield line
elif len(sys.argv) == 6 and sys.argv[4] == "or":
if sys.argv[3] + ' ' in line or sys.argv[5] + ' ' in line:
yield line if __name__ == "__main__":
start = sys.argv[1]
end = sys.argv[2]
files = ["updatelog.{0:06d}".format(i) for i in range(int(start), int(end)+1)] f = find_str(files)
for i in f:
print(i)

第二次改进版本,由于 py2 不支持 yield from 语句,gen_concatenate() 可能有点绕;详细看代码:

#/usr/bin/python

#--

#search string in the binlogs

#usage:
#put this file into binlog-dir,exec as "python test.py 111 123 update" or "python test.py 111 123 update and insert" or "python test.py 111 123 update or delete"
#the nums are the binlog-num. import sys
import subprocess def find_str(files):
print(sys.argv)
for file in files:
comm = "mysqlbinlog {0}".format(file)
lines = subprocess.Popen(comm, shell=True, stdout=subprocess.PIPE)
lines = lines.stdout.readlines()
yield lines #此处返回的是生成器对象 def gen_concatenate(lines):
  #将多个生成器对象迭代返回
for i in lines:
for it in i:
yield it def gen_grep(lines):
for line in lines:
line = line.lower()
if len(sys.argv) == :
if sys.argv[] + ' ' in line:
yield line
elif len(sys.argv) == and sys.argv[] == "and":
if sys.argv[] + ' ' in line and sys.argv[] + ' ' in line:
yield line
elif len(sys.argv) == and sys.argv[] == "or":
if sys.argv[] + ' ' in line or sys.argv[] + ' ' in line:
yield line if __name__ == "__main__":
start = sys.argv[]
end = sys.argv[]
files = ["updatelog.{0:06d}".format(i) for i in range(int(start), int(end)+)] f = find_str(files)
lines = gen_concatenate(f)
greplines = gen_grep(lines)
for i in greplines:
print(i)

脚本1理解起来更加容易,将实现功能全部封装在一个函数体内;

更新:

使用了 re 正则匹配,有时候日志里面记录的表名是带反引号的,比如`user`这样,见代码:

#/usr/bin/python

#2016-04-27

#search string in the binlogs

#usage:
#put this file into binlog-dir,exec as "python test.py 111 123 update" or "python test.py 111 123 update and insert" or "python test.py 111 123 update or delete"
#the nums are the binlog-num. import sys
import subprocess
import re def find_str(files):
print(sys.argv)
for file in files:
comm = "mysqlbinlog {0}".format(file)
lines = subprocess.Popen(comm, shell=True, stdout=subprocess.PIPE)
lines = lines.stdout.readlines()
yield lines def gen_concatenate(lines):
for i in lines:
for it in i:
yield it def gen_grep(lines):
for line in lines:
line = line.lower()
if len(sys.argv) == 4:
# if sys.argv[3] + ' ' in line:
# yield line
str1 = sys.argv[3]
str1_match = re.search(str1, line, re.I)
if str1_match is not None:
yield line
elif len(sys.argv) == 6 and sys.argv[4] == "and":
# if sys.argv[3] + ' ' in line and sys.argv[5] + ' ' in line:
# yield line
str1 = sys.argv[3]
str2 = sys.argv[5]
if re.search(r'\b{}\b'.format(str1), line, re.I) is not None and re.search(r'\b{}\b'.format(str2), line, re.I):
yield line
elif len(sys.argv) == 6 and sys.argv[4] == "or":
# if sys.argv[3] + ' ' in line or sys.argv[5] + ' ' in line:
# yield line
str1 = sys.argv[3]
str2 = sys.argv[5]
if re.search(r'\b{}\b'.format(str1), line, re.I) is not None and re.search(r'\b{}\b'.format(str2), line, re.I):
yield line if __name__ == "__main__":
start = sys.argv[1]
end = sys.argv[2]
files = ["updatelog.{0:06d}".format(i) for i in range(int(start), int(end)+1)] f = find_str(files)
lines = gen_concatenate(f)
greplines = gen_grep(lines)
for i in greplines:
print(i) search.py

search.py

Python 查找binlog文件的更多相关文章

  1. python查找读写文件

    import os ''' 跟据文件名称,后缀查找指定文件 path:传入的路径 filename:要查找的文件名 suffix:要查找的文件后缀 return :返回查找的文件路径 ''' file ...

  2. Python查找指定文件

    在当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件,并打印出相对路径: import os testfiles = [] testfilepaths = [] L = len(os.p ...

  3. 【转】Python查找某文件夹下的所有excel文件

    # -*- coding: utf-8 -*- # author:baoshan import os dirname = r'D:\0.shenma\01.聊城资料\01.数据资料\02.聊城年鉴数据 ...

  4. Python实现对文件夹内文本文件递归查找

    平台:Win7 64 bit,IDLE Python 3.4.0 经常有这样的需求:在一个文本文件里查找特定字符串,这很好实现,用任何文本查看工具几乎都可以做到.而有的时候,想查找一个文件夹下的所有文 ...

  5. python 查找文件内容

    输入查找的文件夹路径,要查找的内容关键字(可以指定多个),要查找的文件类型(可以是多个),搜索出符合条件的文件,并记录所有符合条件的行号及行内容. 写的感觉有点冗余,但好歹还能使用^-^,主要是方便手 ...

  6. python实现在目录中查找指定文件的方法

    python实现在目录中查找指定文件的方法 本文实例讲述了python实现在目录中查找指定文件的方法.分享给大家供大家参考.具体实现方法如下: 1. 模糊查找 代码如下: import os from ...

  7. 使用二分法查找mobile文件中区号归属地

    #!/usr/bin/env python #coding:utf-8 ''' Created on 2015年12月8日 @author: DL @Description: 使用二分法查找mobil ...

  8. Python操作Zip文件

    Python操作Zip文件 需要使用到zipfile模块 读取Zip文件 随便一个zip文件,我这里用了bb.zip,就是一个文件夹bb,里面有个文件aa.txt. import zipfile # ...

  9. python自定义库文件路径

    各有各的小烦恼,各有的小期待 这是人家私事,不要大嘴巴 在Pycharm中import whois时,总是失败 原因是安装了python3.x相关操作过程,将环境变量path中关于Python的配置c ...

随机推荐

  1. 每天学习一点点...css...

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. SAP HANA 创建属性视图

    [Step By Step]SAP HANA创建属性视图(Attribute View) Demo Instruction: 从一张用户信息表中组合出相信地址. 1. 在modeler窗口中,找到相应 ...

  3. iosAPP打包上架xcode中Archive提交成功以后,不提示构建版本问题

    最近在项目更新时遇到Archive提交到开发者中心成功后,一直不提示构建版本信息,可能导致的原因是由于ios10以后对于APP中调用手机相册或摄像头麦克风时需要配置plist文件,配置如下内容或许会解 ...

  4. POJ 3253 Fence Repair (优先队列)

    POJ 3253 Fence Repair (优先队列) Farmer John wants to repair a small length of the fence around the past ...

  5. 安装器---Inno Setup

    Inno Setup[1]  用Delphi写成,其官方网站同时也提供源程序免费下载.它虽不能与Installshield这类恐龙级的安装制作软件相比,但也当之无愧算是后起之秀.Inno Setup是 ...

  6. LeetCode 453. Minimum Moves to Equal Array Elements C#

    Given a non-empty integer array of size n, find the minimum number of moves required to make all arr ...

  7. Quartz简单实例

    Quartz中提供了两种触发器,分别是CronTrigger和SimpleTrigger. 1. SimpleTrigger 每隔若干毫秒来触发纳入进度的任务. 2. CronTrigger 在特定& ...

  8. STM32F103的11个定时器详解(转)

    源:STM32F103的11个定时器详解 STM32F103系列的单片机一共有11个定时器,其中:2个高级定时器4个普通定时器2个基本定时器2个看门狗定时器1个系统嘀嗒定时器 出去看门狗定时器和系统滴 ...

  9. .netER的未来路,关于基础是否重要和应该自己手写代码吗?

    http://www.cnblogs.com/onepiece_wang/p/5558341.html#!comments 引用"基础知识的学习,一开始可能是背书,但是在后续若干年的工作过程 ...

  10. C#中string.Substring 的用法

    String.SubString(int  startIndex,int length)     startIndex:截取字符串开始的位置       length:截取字符串的长度 例子:用户 输 ...