分割文件和数据(linux)
在某些情况下,必须把文件分割成多个更小的片段。如今我们分割文件的目的比如:提高可读性、生成日志、通过Email发送文件等等。
假设我们有一个erro.log的测试文件,其大小为14M。你可以将该文件分割成多文件,例如:
[root@gameserver1 file]# split -b 5M erro.log #-b 大小选项
[root@gameserver1 file]# ls
erro.log xaa xab xac
[root@gameserver1 file]# du -hs *
14M erro.log
5.0M xaa
5.0M xab
3.8M xac
上面的命令将erro.log文件分割成多个文件,以每个文件5M的大小分割。这些文件以xaa、xab、xac的形式命名。这表明他们都有一个字母后缀。如果想以数字为后缀,可以另外使用-d参数。此外,使用-a 可以指定后缀的长度:
[root@gameserver1 file]# split -b 5M erro.log -d -a 4 #-d以数字为后缀 -a 4 表示后缀为4位
[root@gameserver1 file]# ls
erro.log x0000 x0001 x0002
[root@gameserver1 file]# du -hs *
14M erro.log
5.0M x0000
5.0M x0001
3.8M x0002
除了M(MB)后缀,我们还可以使用G(GB)、c(byte)、w(word)、k(KB)等后缀。
刚刚说了为分割的文件名指定了后缀,那么也可以给分割的文件名指定前缀。之前分割的文件名前缀都有一个x,我们可以通过提供一个前缀名来使用自己的文件名前缀,例如:
[root@gameserver1 file]# split -b 5M erro.log -d -a 5 erro_log #erro_log 指定的切割后的文件前缀
[root@gameserver1 file]# ls
erro.log erro_log00000 erro_log00001 erro_log00002
[root@gameserver1 file]# du -hs *
14M erro.log
5.0M erro_log00000
5.0M erro_log00001
3.8M erro_log00002
如果不想按照数据块大小,而是需要根据行数来分割文件的话,可以使用: -l 行数 的格式来进行分割:
[root@gameserver1 file]# split -l 99999 erro.log #按照每个文件99999行来进行分割
[root@gameserver1 file]# ls
erro.log xaa xab xac
[root@gameserver1 file]# du -hs *
14M erro.log
6.7M xaa
6.7M xab
456K xac
另外还有一个工具是csplit。他能够根据指定的条件和字符串匹配选项对日志文件分割。来看看这个工具是如何运作的。
csplit是split工具的一个变体。split只能够根据数据大小或行数进行分割文件,而csplit可以根据文本自身的特点进行分割。是否存在某个单词或文本内容都可以作为分割文件的条件。例如我有一个host.txt文件:
我现在需要将这个文件分割成server1.txt、server2.txt和server3.txt,这些文件的内容分别取自原文件host.txt中不同的server部分。那么,可以使用下面的方法来实现:
[root@gameserver1 file]# csplit host.txt /server/ -n 2 -s {*} -f server -b "%02d.txt" ; rm server00.txt
rm:是否删除普通空文件 "server00.txt"?y
[root@gameserver1 file]# ls
host.txt server01.txt server02.txt server03.txt
[root@gameserver1 file]# cat server01.txt
server-1
192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.5
192.168.1.6
192.168.1.7
[root@gameserver1 file]# cat server02.txt
server-2
192.168.2.1
192.168.2.2
192.168.2.3
192.168.2.4
192.168.2.5
192.168.2.6
192.168.2.7
[root@gameserver1 file]# cat server03.txt
server-3
192.168.3.1
192.168.3.2
192.168.3.3
192.168.3.4
192.168.3.5
192.168.3.6
192.168.3.7
有关命令的详细说明:
csplit host.txt /server/ -n 2 -s {*} -f server -b "%02d.txt" ; rm server00.txt
/server/ 用来匹配某一行,分割过程即从此处开始。
-n 指定分割后的文件名后缀的数字个数,例如:01、02、03等。
-s 使命令进入静默模式,不打印其它信息
{*} 表示根据匹配重复执行分割操作,直到文件末尾为止。也可以用 {整数} 的方式来指定分割执行的次数。
-f 指定分割后的文件名的前缀(在上面的例子中server就是前缀)。
-b 指定后缀格式。例如%02d.txt,类似于C语言中printf的参数格式。在这里 文件名 = 前缀 + 后缀 = server + %02d.txt。
因为分割后的第一个文件没有内容(匹配的单词就位于文件的第一行中),所以我们删除了server00.txt。
综上所述:
split,可以根据数据大小和行数来进行分割
csplit,可以根据文本自身的特点进行分割
分割文件和数据(linux)的更多相关文章
- split分割文件与数据
split主要用途:在之前计算机发展的时候,我们必须分割文件,才能将大量数据放入多张软盘中,而今我们分割文件有了其他的目的,比如提高可读性,生成日志以及发送有大小限制的E-mail附件. 工作原理:s ...
- Linux split命令参数及用法详解---linux分割文件命令
转载自:http://blog.csdn.net/xiaoshunzi111/article/details/52173994 功能说明:分割文件. Split:按指定的行数截断文件 格式: spli ...
- Linux命令(十二) 分割文件 split 合并文件 join
一.分割文件 split 命令介绍 当处理文件时,有时需要将文件做分割处理,split 命令用于分割文件,可以分割文本文件,按指定的行数分割,每个分割后的文件都包含相同的行数.split 可以分割非文 ...
- Java-->利用文件指针分割文件
--> 大体上和字节流分割的方式没什么区别,只是加入文件指针确定要开始分割的位置... package com.dragon.java.splitmp3; import java.io.File ...
- 字符设备驱动1:新的方式添加cdev + 在open函数中将文件私有数据指向设备结构体
本例中,驱动入口处,使用cdev_add添加驱动,这点也可与字符设备驱动0:一个简单但完整的字符设备驱动程序对比一下. 另外主要讲xx_open实现文件私有数据指向设备结构体. 引子: 偶然看到,在j ...
- hadoop学习;大数据集在HDFS中存为单个文件;安装linux下eclipse出错解决;查看.class文件插件
sudo apt-get install eclipse 安装后打开eclipse,提示出错 An error has occurred. See the log file /home/pengeor ...
- 十二、文件和目录——Linux文件系统结构
12.1 Linux文件系统结构 12.1.1 文件操作基本元素 文件操作相关的最基本元素是:目录结构,索引节点和文件的数据本身 目录结构(目录项) 索引节点(i 节点) 文件的数据 12.1.2 文 ...
- Oracle使用超大SQL脚本文件恢复数据问题记录
在以前获取的Oracle数据库备份一般都是dmp文件,创建表空间和用户就直接使用imp或者impdp导入即可. 这一次遇到的情况比较特殊,对方提供数据时给我的是使用SQLPlus导出的SQL脚本文件, ...
- hive数据库从文件插入数据得到结果NULL?
今天第一次接触hive这个东东,跟着教程走,当把本地文件的数据装载到新建的hive的表中时,得到的结果是NULL,如图: 也不知道为什么,初次接触,对它的这个构造还不是很熟悉,看一下建表语句: 解决: ...
随机推荐
- Rails Create--params说明
参考:https://ruby-china.github.io/rails-guides/getting_started.html 表单提交后,其字段以参数形式传递给 Rails,然后就可以在控制器动 ...
- day21-双下eq方法
class Goods: def __init__(self,name): self.name = name def __eq__(self,other): #self = apple1, other ...
- Java接口和抽象类区别
1.抽象类 [public] abstract class ClassName { abstract void fun(); } extends 包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有 ...
- python学习笔记(12)常用模块
一.模块.包 什么是模块? 模块实质上就是一个python文件,它是用来组织代码的,意思就是说把python代码写到里面,文件名就是模块的名称,test.py test就是模块名称. 什么是包? 包, ...
- Amsterdam Distance
题目描述 Your friend from Manhattan is visiting you in Amsterdam. Because she can only stay for a short ...
- 倾斜摄影数据转cesium 3D tiles工具介绍
软件操作:http://jingyan.baidu.com/article/3aed632e3912c8701080912c.html 软件测试数据: 数据,油库链接: http://pan.baid ...
- 对kotlin和java中的synchronized的浅谈
synchronized在java中是一个关键字,但是在kotlin中是一个内联函数.假如分别在java和kotlin代码锁住同一个对象,会发生什么呢,今天写了代码试了试.首先定义people类 12 ...
- Derby 命令
SHOW [ TABLES | VIEWS | PROCEDURES | FUNCTIONS | SYNONYMS ] { IN sche -- 列出表.视图.过程.函数或同义词 SHOW INDEX ...
- python中字母与ASCII码之间的转换以及进制间的转换
字母与ascii码: ord(c):参数是长度为1的字符串,简称字符.当参数为统一对象时(unicode object),返回能代表该字符的统一编码,当参数为8比特的字符串时,返回该字节的值.例如,o ...
- nodejs express 框架 上传文件
web 项目应用express4.0框架 html 表单post 文件上传失败,后端无法获取提交文件 express不支持文件上传. 方式一 若是图片,可以将图片转码为BASE64上传 前端框架ang ...