当须要将较大的数据上传到服务器,或从服务器下载较大的日志文件时,常常会由于网路或其它缘由而引致传输中断而不得不重新传输。这些情况下,可以先将大文件分割成小文件后分批传输,传完后再合并文件。
备份文件时往往涉及到大文件传输的问题,遇见网路质量不佳或则其他问题往往会造成传输中断,而不得不进行重传。若果采用先将大文件拆分成多个小文件进行传输、待全部传输完成后合并所有文件的形式,常常可以改善传输体验。
分拆,顾名思义,就是将一个大的文件分割成若干个较小的文件,这种小文件按顺序拼接后可以还原大文件。一般情况下,按照文件大小进行分拆是较为常见的形式;但因为文本文件具有行数特点,所以不仅按大小分拆之外,也可以按行数分拆。
合并,就是将若干个较小的文件拼接成一个较大文件。一般只须要按顺序联接即可,相对比较简单。一般情况下,为确保分拆前和合并后的两个文件相同,须要进行验证。
分割文件
split是Linux环境提供的文件分拆实用程序,同时支持二补码文件和文本文件。一般情况下早已随coreutils外置于系统中,无需另行安装。文件分割可以使用split命令,该即支持文本文件分割,又支持二补码文件分割;而合并文件可以使用cat命令。默认按1000行为单位进行切分,前缀PREFIX默认为x。若果没有文件,或则当文件是-,从标准输入读取。二补码文件和文本文件按大小分拆时使用的选项不同:◈二补码文件使用-b选项指定分割后的文件大小。◈文本文件则使用-C选项指定分割后的文件大小。
文本文件分割
分割文本文件时,可以按文件大小分割,也可以按文本行数分割。
按文件大小分割
按文件大小分割文件时,须要以-C参数指定分割后的文件大小:
split-C100Mlarge_file.txtstxt
如上所示,我们将大文件large_file.txt按100M大小进行分割,并指定了分割后文件前缀stxt;当不指定前缀时,split会手动对分割文件进行命名,通常会以x开头。
split-l5test.txttest.txt的结果是test.txtaatest.txtab
split-l5test.txt的结果是xaaxab
按行分割
默认按1000行为单位进行切分,前缀PREFIX默认为x。文本文件还可以以行为单位进行分割,以行数进行分割时会忽视文件大小,并以-l参数指定分割后文件的行数:
split-l1000large_file.txtstxt
按10行分割文件,每位文件的后缀从000开始。
split-a3-d-10/etc/passwdlvlv
将文件BLM.txt分成若干个小文件,每位文件2482行(-l2482),文件前缀为BLM_,系数不是字母而是数字(-d),后缀系数为四位数(-a4)
split-l2482../BLM/BLM.txt-d-a4BLM_
二补码文件分割
二补码文件分割类似于按大小分割文本文件,不同的是以-b参数来指定分割后的文件大小:
split-b100Mdata.baksdata
文件合并
文件合并使用cat命令,前面几种方法分割的文件都可以使用cat命令合并。cat命令合并分割文件:catstxt*>new_file.txt
cat是linux环境提供的文件联接实用程序,才能联接文件并将其输出到标准输出。一般情况下早已随coreutils外置于系统中,无需另行安装。值得注意的是linux命令行,为了保证合并后的文件和原始文件一致,在有条件的情况下,可以用diff命令验证。
使用cat合并文件可以采用cat[文件...]>[合并后的文件名]的格式,此方式对二补码文件和文本文件均有效。
使用diff验证文件只须要按diff[原文件][现文件]的格式执行即可。若果没有输出,则证明两个文件之间没有差别。
命令格式
split命令说明
split命令格式如下:
split[选项]...[要切割的文件[输出文件前缀]]命令参数-a,--suffix-length=N使用厚度为N的后缀(默认2)指定分割后文件名的后缀字符数量(后缀宽度),默认是2-b,--bytes=SIZE设置输出文件的大小。支持单位:m,k指定每一子输出文件的大小,单位byte-C,--line-bytes=SIZE设置输出文件的最大行数。与-b类似,但会尽量维持每行的完整性子文件中,单行的最大字节数-d,--numeric-suffixes使用数字后缀替代字母使用数字作为后缀,从0开始--numeric-suffixes[=FROM]作用同-d,但可以设置起始数字-l,--lines=NUMBER设备输出文件的行数指定多少行分割成一个小文件-t,--separator=SEP使用SEP取代换行符作为记录分隔符--verbose分割文件时输出冗余信息--help显示版本信息--version输出版本信息
cat命令说明
cat是Linux下使用频度较高的命令之一,该令详尽介绍:cat联接文件并复印到标准输出设备上cat命令的常见使用场景有:显示文件内容:catfilename创建一个空文件:cat>filename文件合并:catfile1file2>file将a.txt的内容输入到b.txt的末尾cata.txt>>b.txt
应用实例
Linux大文件快速处理小的办法
1.背景
工作中使用MapReduce任务导入一批富含路径的文件linux 大文件,共计行数300W+,须要检查文件是否在对应的服务器中存在,而文件所在的服务器并非hadoop集群的服务器,为此准备采用bash脚本进行。具体的方式如下(可直接看技巧2,方式1效率较低):
2.采用的方式
a.方式1
原先准备使用如下脚本,进行简单验证:
!/bin/bashbrcount=0brcat oriTest.txt | while read databrdobrcount=$(( $count+1 ))brecho $countbrdir=echo "$data" | awk -F "t" '{print $5}'brif [ -e $dir ];thenbrecho "$data" >> exist.txtbrelsebrecho "$data" >> noexist.txtbrfibrdone
原始数据格式如下:namemarkiddir运行时发觉处理5000行须要将近4、5分钟的时间(机器为8核),果断不行啊,随即准备采用多进程的方式来执行,见技巧2
b.技巧2
主要是通过将大文件分为小文件,之后对小文件进行后台遍历读取,脚本如下:
!/bin/bashbrsource ~/.bashrc
判定路径是否存在
readdata(){brcat $1 | while read databrdobrdir=echo "$data" | awk -F "t" '{print $5}'brif [ -e $dir ];thenbrecho "$data" >> "exist_$1.txt"brelsebrecho "$data" >> "noexist_$1.txt"brfibrdonebr}
大文件切分为小文件,生成文件名为xaa,axb等(可以自己命名文件)
split -l 10000 oriTest.txtbrdeclare -a files # 声明数组brfiles=($(ls x*)) # 分割后的小文件名保存数组
遍历,并后台执行
for i in ${files[@]};dobrecho $ibrreaddata $i &brdone
Linux下日志文件过大的解决方案
不晓得你们有没有碰到过,系统忽然出现了问题,系统疯狂打日志,致使c盘出现问题linux 大文件,或则日志过多根本没办法阅读。常常会想到linux标准教程,对日志文件切分,这样可以留下重要的日志,而删除毋须要的日志。下边就来详尽介绍这些技巧。我们可以每天都进行切分日志的操作,那要这样的话,为了防止混淆,我们切分下来的日志都应当带上日期。其实日期我们可以通过以下句子获取:
current_date=`date -d "-1 day" "+%Y%m%d"`
date-d"-1day"表示获取前三天的日期,就是说我们明天操作的话是切割明天的日志。+%Y%m%d是具体的日期格式,也就是年月日格式,例如:20181005。
接出来,我们再切割日志。
split -b 65535000 -d -a 4 myout.txt ./log/log_${current_date}_
其中,65535000是60M,也就是日志文件按60M大小进行切割,可自定义大小。-d-a4表示文件后缀是4位。我们将文件切割后要按顺序进行编号,例如0000,0001,0002……这个4就代表编号的位数。
再然后的./log/log${current_date}就是切割后日志文件的前缀,上面就带入了当前日期。所以,最终的输出格式类似于:log_20181005_0001。
日志文件切割完以后,就可以将日志文件删掉了,否则就丧失切割文件的意义了。删掉的方式可以用以下形式:cat/dev/null>nohup.out将以上这种命令写在一个脚本里,每天运行它,就可以将日志文件切割成若干份,以便我们排查。完整的代码如下:
#!/bin/bash brcurrent_date=`date -d "-1 day" "+%Y%m%d"` brsplit -b 65535000 -d -a 4 /home/alvin/myout.txt /home/alvin/log/log_${current_date}_ brcat /dev/null > nohup.out