日志文件分割、命名

工作中经常会收到测试同学、客户同学提供的日志文件,其中不乏几百M一G的也都有,毕竟压测一晚上产生的日志量还是很可观的,xDxD,因此不可避免的需要对日志进行分割,通常定位问题需要针对时间点,因此最好对分割后的日志文件使用文件中日志的开始、结束时间点来命名,这样使用起来最为直观,下面给大家分享两个脚本,分别作分割、命名,希望能够给大家提供一点点帮助;

大文件分割

用法:

  1. python split_big_file.py
  2. 输入文件全路径名
  3. 输入期望的分割后每个小文件的行数
  4. Just wait.

代码如下:

  1. # -*- coding:utf-8 -*-
  2. import os,re,shutil
  3. import platform
  4. sys_name = platform.system().lower()
  5. SPLIT_CHAR = '\\' if sys_name.find('windows') != -1 else '/'
  6. print('input big files`s path:')
  7. _path = raw_input()
  8. names = []
  9. pathes = []
  10. if os.path.isfile(_path):
  11. print('is file')
  12. names.append(_path)
  13. else:
  14. print('is nothing')
  15. '''
  16. elif os.path.isdir(_path):
  17. print('This is dir')
  18. pathes = os.listdir(_path)
  19. print('pathes='+str(pathes))
  20. for i in range(len(pathes)):
  21. fullpath = _path+SPLIT_CHAR+pathes[i]
  22. print('fullpath='+fullpath)
  23. if os.path.isfile(fullpath):
  24. names.append(fullpath)
  25. files.append(open(fullpath).read().split('\n'))
  26. '''
  27. print(len(names))
  28. line_num = int(raw_input('every file`line num = '))
  29. print('line number='+str(line_num))
  30. for i in range(len(names)):
  31. _name = names[i]
  32. ori_name = _name.split(SPLIT_CHAR)[len(_name.split(SPLIT_CHAR))-1]
  33. dir_name = _name.replace(ori_name,'DIR_'+ori_name)
  34. dir_name = dir_name.replace('.','_')
  35. print ori_name
  36. print dir_name
  37. os.system('mkdir '+dir_name)
  38. count = 1
  39. print '已处理:'+str(count)+'行'
  40. part_file = open(dir_name+SPLIT_CHAR+str(0)+'.part.txt','w')
  41. with open(_name, 'rb') as f:
  42. for line in f:
  43. if count%line_num == 0:
  44. part_file.close()
  45. part_file = open(dir_name+SPLIT_CHAR+str(int(count/line_num))+'.part.txt','w')
  46. part_file.write(line+'\n')
  47. count+=1
  48. if count%100000 == 0:
  49. print '已处理:'+str(count)+'行'
  50. print '已处理:'+str(count)+'行'
  51. os.system('python ./get_name_logfile.py '+dir_name)

文件按照开始、结束行时间戳重命名

用法:

  • python get_name_logfile.py log.txt
  • python get_name_logfile.py logs

参数选择文件或者文件夹均可,如果是文件夹,则会针对文件夹中的每个文件做处理(不会递归到文件夹下文件夹中的文件哦);

代码如下:

  1. # -*- coding:utf-8 -*-
  2. import os,re,shutil
  3. import sys
  4. import platform
  5. sys_name = platform.system().lower()
  6. SPLIT_CHAR = '\\' if sys_name.find('windows') != -1 else '/'
  7. _path = sys.argv[1]
  8. names = []
  9. files = []
  10. pathes = []
  11. if os.path.isfile(_path):
  12. print('is file')
  13. names[0] = _path
  14. elif os.path.isdir(_path):
  15. print('This is dir')
  16. pathes = os.listdir(_path)
  17. print('pathes='+str(pathes))
  18. for i in range(len(pathes)):
  19. fullpath = _path+SPLIT_CHAR+pathes[i]
  20. print('fullpath='+fullpath)
  21. if os.path.isfile(fullpath):
  22. names.append(fullpath)
  23. else:
  24. print('is nothing')
  25. print(len(names))
  26. # 日期格式 : 05-26 18:20:42.093 r'\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}'
  27. #
  28. # 05-26 18:20:43.093:r'\d{2}-\d{2} {1,}\d{2}:\d{2}:\d{2}.\d{1,10}'
  29. date_reg = r'\d{2}-\d{2} {1,}\d{2}:\d{2}:\d{2}.\d{1,10}'
  30. time_reg = r'\d{2}:\d{2}:\d{2}.\d{1,10}'
  31. for i in range(len(names)):
  32. _name = names[i]
  33. print('name='+_name)
  34. # head 尝试在10行内查找日期
  35. head_len = 10
  36. start_time = '(start_time-'
  37. _file_ = open(_name, 'rb')
  38. reads = _file_.read()
  39. _file = reads.split('\n')
  40. if len(_file)/2 < 10:
  41. head_len = len(_file)/2
  42. for j in range(head_len):
  43. res = re.search(date_reg, _file[j])
  44. if res!=None and res.group(0)!=None:
  45. start_time = res.group(0)
  46. print('start_time='+start_time)
  47. break
  48. # tail
  49. tail_len = len(_file)-head_len
  50. end_time = '-end_time)'
  51. for j in range(len(_file)-1,tail_len-1,-1):
  52. res = re.search(time_reg, _file[j])
  53. if res!=None and res.group(0)!=None:
  54. end_time = res.group(0)
  55. print('end_time='+end_time)
  56. break
  57. _file_.close()
  58. ori_name = _name.split(SPLIT_CHAR)[len(_name.split(SPLIT_CHAR))-1]
  59. print('ori_name='+ori_name)
  60. new_name = start_time.replace(':','-')+'__'+end_time.replace(':','-')+os.path.splitext(ori_name)[1]
  61. print('new_name='+new_name)
  62. print("copy %s %s" % (_name, _name.replace(ori_name,new_name)))
  63. #os.system ("copy %s %s" % (_name, _name.replace(ori_name,new_name)))
  64. shutil.copy(_name,_name.replace(ori_name,new_name))
  65. os.system ("rm -rf "+_name)

最后

大家可以到我的Github上看看有没有其他需要的东西,目前主要是自己做的机器学习项目、Python各种脚本工具、数据分析挖掘项目以及Follow的大佬、Fork的项目等:

https://github.com/NemoHoHaloAi

大文件分割、命令脚本 - Python的更多相关文章

  1. Linux大文件分割splite

    /********************************************************************** * Linux大文件分割splite * 说明: * 编 ...

  2. Linux中split大文件分割和cat合并文件

    当需要将较大的数据上传到服务器,或从服务器下载较大的日志文件时,往往会因为网络或其它原因而导致传输中断而不得不重新传输.这种情况下,可以先将大文件分割成小文件后分批传输,传完后再合并文件. 1.分割 ...

  3. c#大文件分割过程

    需求: 在项目开发中,我们会遇到单个文件大小超过1TB的文件,这样的文件只能进行单文件读取,往往会造成读取完成耗时过长,导致客户在使用体验过程中不满意. 为了解决提升大文件的解析速度,我想到了先分割大 ...

  4. android下大文件分割上传

    由于android自身的原因,对大文件(如影视频文件)的操作很容易造成OOM,即:Dalvik堆内存溢出,利用文件分割将大文件分割为小文件可以解决问题. 文件分割后分多次请求服务. //文件分割上传 ...

  5. PHP + JS 实现大文件分割上传

    服务器上传文件会有一定的限制.避免内存消耗过大影响性能,在 php.ini 配置文件中,有几个影响参数: upload_max_filesize = 2M //PHP最大能接受的文件大小 post_m ...

  6. Html5 突破微信限制实现大文件分割上传

    先来前端代码 <!DOCTYPE html> <html> <head> <meta name="viewport" content=&q ...

  7. c# 大文件分割 复制 Filestream 进度条

    大文件分割复制,每次复制100M 也可以复制别的较大数值. 小于1G的小文件就直接复制得了.代码里没写 ,但是很简单 直接写进去就好了,难得是分割复制 所以没写. 好吧 我还是改了 改成小文件也可以复 ...

  8. FileStrem大文件分割复制

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  9. formdata方式上传文件,支持大文件分割上传

    1.upload.html <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/html"> <h ...

随机推荐

  1. 剑指Offer(二十二):从上往下打印二叉树

    剑指Offer(二十二):从上往下打印二叉树 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/b ...

  2. JNI开发流程

    交叉编译 在一个平台上去编译另一个平台上可以执行的本地代码 cpu平台 arm x86 mips 操作系统平台 windows linux mac os 原理 模拟不同平台的特性去编译代码 jni开发 ...

  3. 一、mysql数据库,忘记密码怎么处理及处理过程中遇见的问题

    1.输入cmd命令打开控制台: 2.进入mysql.exe所在的路径: 3.执行mysqld --skip-grant-tables(注意:在输入此命令之前先在任务管理器中结束mysqld.exe进程 ...

  4. Eclipse Paho MQTT Utility

    下载地址: https://repo.eclipse.org/content/repositories/paho-releases/org/eclipse/paho/org.eclipse.paho. ...

  5. jasypt

    jasypt-1.9.0.jar import org.jasypt.encryption.pbe.StandardPBEStringEncryptor; public class EncryptUt ...

  6. React 路由&脚手架

    1.创建react项目 npm install -g create-react-app 全局环境 create-react-app my-app 创建项目 cd my-app 进入项目 npm sta ...

  7. [python]python中的if, while, for

    python中的代码块,通过缩进对齐,来表达代码逻辑. 1. if语句 if expression1: if_suite elif expression2: elif_suite else: else ...

  8. CF 1206D - Shortest Cycle Floyd求最小环

    Shortest Cycle 题意 有n(n <= 100000)个数字,两个数字间取&运算结果大于0的话连一条边.问图中的最小环. 思路 可以发现当非0数的个数很大,比如大于200时, ...

  9. POJ-1847 Tram( 最短路 )

    题目链接:http://poj.org/problem?id=1847 Description Tram network in Zagreb consists of a number of inter ...

  10. IDC是什么?

    IDC:互联网数据中心,是电信部门利用已有的互联网通信线路.贷款资源,建立标准化的电信专业级机房环境,为企业.政府提供服务器托管.服务器租用以及相关增值等方面服务.IDC是全球协作的特定设备网络,用来 ...