Linux Bash Shell (五)--如何创建临时文件, 分割大文件?

Linux Bash Shell (五)–如何创建临时文件, 分割大文件?

前言

这篇文章主要包含3个部分:

  1. 如何利用mktemp创建临时文件
  2. 如何利用split分割大文件
  3. 如何利用csplit分割大文件

让我们一起来学习吧~

利用mktemp创建临时文件

在写脚本的过程中,我们经常需要存储临时数据,在linux系统下最合适放临时数据的地方是/tmp,这个目录下的内容会在重启的时候被清除。
mktemp命令可以用来创建临时的文件,目录。

mktemp用法

  1. 创建临时文件
# 创建临时文件
filename=`mktemp`
echo $filename
ls -sh $filename
/tmp/tmp.GwNTasidb2
0 /tmp/tmp.GwNTasidb2

可以看到,系统在/tmp目录下生成了一个名字为tmp.E2JEOSq2et的文件,并且是一个空文件。

  1. 创建临时目录
# 创建临时目录
dirname=`mktemp -d`
echo $dirname
ls -sh $dirname
/tmp/tmp.EFkrjMGdsL
total 0

同样的,这是一个空目录。

  1. mktemp可以只生成文件名,并不真正的创建文件或目录
tmpfile=`mktemp -u`
echo $tmpfile
ls -sh $tmpfile
/tmp/tmp.1Y329IeTkW
ls: cannot access '/tmp/tmp.1Y329IeTkW': No such file or directory

可以看到,虽然文件名仍然是/tmp开头的,但是实际文件并不存在。

  1. 按照模板生成临时文件名,同样的这个命令只生成文件名。
mktemp log.XXX  # 注意这里只能用X作占位符,有多少个X,文件名就会有对应数量的随机字符
log.TMH

利用split命令分割大文件

某些场景下我们需要分割文件,比如为了可读性,生成log,通过邮件发送文件等。
现有一个文件data.file 大小为100KB。

  1. 按大小为10K分割文件
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个数字作为后缀的文件。

  1. 为分割的文件指定文件名的前缀

默认情况下,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作为前缀的文件。

  1. 按照行数分割文件

现有一个文件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")。

你可能感兴趣的:(linux-shel,linux,shell)