这篇文章主要包含3个部分:
mktemp
创建临时文件split
分割大文件csplit
分割大文件让我们一起来学习吧~
mktemp
创建临时文件在写脚本的过程中,我们经常需要存储临时数据,在linux系统下最合适放临时数据的地方是/tmp,这个目录下的内容会在重启的时候被清除。
mktemp
命令可以用来创建临时的文件,目录。
# 创建临时文件
filename=`mktemp`
echo $filename
ls -sh $filename
/tmp/tmp.GwNTasidb2
0 /tmp/tmp.GwNTasidb2
可以看到,系统在/tmp
目录下生成了一个名字为tmp.E2JEOSq2et的文件,并且是一个空文件。
# 创建临时目录
dirname=`mktemp -d`
echo $dirname
ls -sh $dirname
/tmp/tmp.EFkrjMGdsL
total 0
同样的,这是一个空目录。
tmpfile=`mktemp -u`
echo $tmpfile
ls -sh $tmpfile
/tmp/tmp.1Y329IeTkW
ls: cannot access '/tmp/tmp.1Y329IeTkW': No such file or directory
可以看到,虽然文件名仍然是/tmp开头的,但是实际文件并不存在。
mktemp log.XXX # 注意这里只能用X作占位符,有多少个X,文件名就会有对应数量的随机字符
log.TMH
split
命令分割大文件某些场景下我们需要分割文件,比如为了可读性,生成log,通过邮件发送文件等。
现有一个文件data.file 大小为100KB。
split -b 10k data.file
ls
data.file xaa xab xac xad xae xaf xag xah xai xaj
可以看到生成了10个文件xaa-xaj。文件名以x开头,以字母编号aa-aj为后缀。
我们可以通过-d
指定使用数字后缀,并通过-a
指定数字长度
split -b 10k data.file -d -a 3
ls x0*
x000 x001 x002 x003 x004 x005 x006 x007 x008 x009
可以看到生成了x000-0009共10个数字作为后缀的文件。
默认情况下,split生成的文件以x作为文件名的前缀,我们可以为split指定文件名前缀
用法如下:
split [cmd args] PREFIX
split -b 10k data.file -d -a 4 split_file
ls split_file*
split_file0000 split_file0002 split_file0004 split_file0006 split_file0008
split_file0001 split_file0003 split_file0005 split_file0007 split_file0009
我们可以看到生成了10个以split_file作为前缀的文件。
现有一个文件line_data.file,其有6行数据。
cat line_data.file
1
2
3
4
5
6
split -l 2 line_data.file -d -a 1 line_split
ls line_split*
line_split0 line_split1 line_split2
可以看到按照每个文件2行,split
命令根据line_data.file 生成了3个文件,其内容分别如下所示:
cat line_split0
1
2
cat line_split1
3
4
cat line_split2
5
6
csplit
用法csplit
是一个split
的变形,功能比split
更强大。split
只能根据文件块大小或者行数分割文件。
而csplit
可以根据比如一个确定的单词或者文本内容分割文件。
比如下面一个文件server.log,其内容如下:
cat server.log
SERVER-1
[connection] 192.168.0.1 success
[connection] 192.168.0.2 failed
[disconnect] 192.168.0.3 pending
[connection] 192.168.0.4 success
SERVER-2
[connection] 192.168.0.1 failed
[connection] 192.168.0.2 failed
[disconnect] 192.168.0.3 success
[connection] 192.168.0.4 failed
SERVER-3
[connection] 192.168.0.1 pending
[connection] 192.168.0.2 pending
[connection] 192.168.0.3 pending
[connection] 192.168.0.4 failed
csplit server.log /SERVER/ -n 2 -s {*} -f server -b "%02d.log"; rm server00.log
ls server*
server.log server01.log server02.log server03.log
/SERVER/
: 分割文件时用来匹配的行。/REGEX/
是匹配的格式,它会从文件的第一行开始复制直到遇到匹配到的包含"SERVER"的一行,并不不包括匹配的那行。{*}
: 用来指定重复执行split的次数直到文件结束。另外可以通过{integer}
指定重复的次数。-n
: 用来指定作为文件后缀的数字的位数。比如01,02,03等。-s
: 是让命令沉默的标识,指定-s
命令不会打印其他信息。-f
: 用来指定文件名的前缀,这里是"server"。-b
: 用来指定文件名后缀的格式, “%02d.log” 就像c语言中printf的格式。 在这里文件名是前缀(“server”)+后缀("%02d.log")。