在某些情况下,必须把文件分割成多个更小的片段。如今我们分割文件的目的比如:提高可读性、生成日志、通过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)的更多相关文章

  1. split分割文件与数据

    split主要用途:在之前计算机发展的时候,我们必须分割文件,才能将大量数据放入多张软盘中,而今我们分割文件有了其他的目的,比如提高可读性,生成日志以及发送有大小限制的E-mail附件. 工作原理:s ...

  2. Linux split命令参数及用法详解---linux分割文件命令

    转载自:http://blog.csdn.net/xiaoshunzi111/article/details/52173994 功能说明:分割文件. Split:按指定的行数截断文件 格式: spli ...

  3. Linux命令(十二) 分割文件 split 合并文件 join

    一.分割文件 split 命令介绍 当处理文件时,有时需要将文件做分割处理,split 命令用于分割文件,可以分割文本文件,按指定的行数分割,每个分割后的文件都包含相同的行数.split 可以分割非文 ...

  4. Java-->利用文件指针分割文件

    --> 大体上和字节流分割的方式没什么区别,只是加入文件指针确定要开始分割的位置... package com.dragon.java.splitmp3; import java.io.File ...

  5. 字符设备驱动1:新的方式添加cdev + 在open函数中将文件私有数据指向设备结构体

    本例中,驱动入口处,使用cdev_add添加驱动,这点也可与字符设备驱动0:一个简单但完整的字符设备驱动程序对比一下. 另外主要讲xx_open实现文件私有数据指向设备结构体. 引子: 偶然看到,在j ...

  6. hadoop学习;大数据集在HDFS中存为单个文件;安装linux下eclipse出错解决;查看.class文件插件

    sudo apt-get install eclipse 安装后打开eclipse,提示出错 An error has occurred. See the log file /home/pengeor ...

  7. 十二、文件和目录——Linux文件系统结构

    12.1 Linux文件系统结构 12.1.1 文件操作基本元素 文件操作相关的最基本元素是:目录结构,索引节点和文件的数据本身 目录结构(目录项) 索引节点(i 节点) 文件的数据 12.1.2 文 ...

  8. Oracle使用超大SQL脚本文件恢复数据问题记录

    在以前获取的Oracle数据库备份一般都是dmp文件,创建表空间和用户就直接使用imp或者impdp导入即可. 这一次遇到的情况比较特殊,对方提供数据时给我的是使用SQLPlus导出的SQL脚本文件, ...

  9. hive数据库从文件插入数据得到结果NULL?

    今天第一次接触hive这个东东,跟着教程走,当把本地文件的数据装载到新建的hive的表中时,得到的结果是NULL,如图: 也不知道为什么,初次接触,对它的这个构造还不是很熟悉,看一下建表语句: 解决: ...

随机推荐

  1. Kubernetes系列二: 使用kubeadm安装k8s环境

    环境 三台主机,一台master,两台node 作为master 作为node节点 作为node节点 每台主机Centos版本使用 CentOS Linux release 7.6.1810 (Cor ...

  2. Codeforces 1293A - ConneR and the A.R.C. Markland-N

    题目大意: ConneR老师想吃东西,他现在在大楼的第s层,大楼总共有n层,但是其中有k层的餐厅关门了. 然后给了这k层关门的餐厅分别所在的楼层. 所以问ConneR老师最少得往上(或者往下)走几层楼 ...

  3. 2019-2020-1 20199324《Linux内核原理与分析》第一周作业

    1.问题:使用banner输出图形字符为什么都是大写? 2.实验二:基本概念及操作 作业:命令toilet和figlet的使用 使用如下命令安装 $ sudo apt-get update $ sud ...

  4. 二:MySQL的操作

    1:创建数据库 create database  bjpowernode ; 2:使用数据库 use bjpowernode; 3:导入数据库文件sql source  然后把SQL文件拖过来就可以了 ...

  5. 个人云主机 博客上线 家用宽带-树莓派2-certbot-docker 运行环境简介

    https://blog.cuidp.top/ 博客主页,目前刚建好,没什么数据 服务是 https://github.com/TryGhost/Ghost 现插件是https://github.co ...

  6. [LC] 295. Find Median from Data Stream

    Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...

  7. Django中查询相关操作

    查询集特性 1)惰性查询:只有在实际使用查询集中的数据的时候才会发生对数据库的真正查询. 2)缓存:当使用的是同一个查询集时,第一次使用的时候会发生实际数据库的查询,然后把结果缓存起来,之后再使用这个 ...

  8. vue日常问题总结

    1.Vue项目启动后首页URL带的#该怎么去掉? vue-router中默认使用的是hash模式,URL中带有#号,我们可以用如下代码修改成history模式: import Vue from 'vu ...

  9. wPF,解决UI界面实时更新的问题

    private void button1_Click(object sender, RoutedEventArgs e) { Thread thread = new Thread(new Thread ...

  10. 维生素D补充过多会中毒

    虽然我们的物质生活越来越丰富,各种食材几乎一年四季都能够吃到,然而却越来越多的人选择进行补充各种维生素,但是你知道吗?维生素不是我们想象中多吃无害的,补充过多也会要人命,特别是最近非常流行补充的一种维 ...