首页 > 代码库 > 2.10临时文件命名与随机数

2.10临时文件命名与随机数

编写shell脚本时,经常需要存储临时数据,系统中最适合存储临时数据的位置/tmp(该目录中的内容在系统重启后会清空)。

1)创建临时文件

$ filename=`mktemp`

$ echo $filename

/tmp/tmp.8xvhkjF5fH

上面的代码创建了一个临时文件,并打印出存储在$filename中的文件名。

2)创建临时目录

$ dirname=`mktemp -d`

$ echo $dirname

tmp.NI8xzW7VRX

上面的代码创建了一个临时目录,并打印出存储在$dirname中的目录名

3)如果想仅仅想生成文件名,又不希望创建实际的文件或目录,

$ tmpfile=`mktemp -u`

$ echo $tmpfile

/tmp/tmp.RsGmilRpcT

文件名存储在$tmpfile中,但并没有创建对应的文件

4)根据模板创建临时文件名

$ mktemp test.XXX

text.2c

工作原理:mktemp它生成一个临时文件并返回其文件名(如果创建的是目录,返回目录名),如果提供了定制模板,X会被随机的字符(数字或字母)替换,注意,mktemp正常工作的前提是保证模板中至少要有3个X。

2.11分割文件和数据

1)工作原理

假设有一个文件data.file,其大小为100KB,将它分割成多个大小为10KB的文件,如下

$ split -b 10k data.file

$ ls

data.file xaa xab xac xad xae xaf xag xah xai xaj

这些文件以xab,xac,xad形式命名,这表明他们都有一个字母后缀,可以使用-d参数来以数字后缀,以及-a 指定后缀长度,如

$ split -b 10k data.file -d -a 4

除了k(KB)后缀,还有M(MB),G(GB),c(byte),w(word)。

2)补充内容

a、为分割后的文件指定文件名前缀

之前那些分割后的文件都有一个文件名前缀x,下面使用自己自定义的前缀,其格式如下

$ split [COMMAND_ARGS] PREFIX

$ split -b 10k data.file -d -a 4 split_file

如果不像按照数据块大小,而是需要根据行数来分割文件的话,可以使用-l no_of_lines,如

$ split -l 10 data.file

#分割多个文件,每个文件包含10行

b、csplit,它能够根据指定的条件和字符串匹配选项对日志文件进行分割。它是split工具的一个变体,split只能根据数据大小或行数分割文件,而csplit可以根据文本自身的特点进行分割--是否存在某个单词或文本内容都可以作为分割文本的条件。

如,把一个log里面含有多个SERVER的部分分割成多个log文件

$ csplit server.log /SERVER/ -n 2 -s {*} -f server -b "%02d.log" ; rm server00.log

$ ls

server01.log  server02.log server03.log server.log

/SERVER/:用来匹配某一行,分割过程即从此处开始

/[REGEX]/:表示文本样式,包括从当前行(第一行)直到(但不包括)包含“SERVER”的匹配行。

{*}:表示根据匹配重复执行分割,直到文件末尾为止,可以用{整数}的形式来指定分割执行的次数。

-s使命令进入静默模式,不打印其他信息

-n指定分割后的文件名后缀的数字个数,例如01,02,03等

-f指定分割后的文件名前缀

-b指定后缀格式。例如%02d.log,类似于c语言中的printf的参数格式。

因为上面分割后的第一个文件没有任何内容(匹配的单词就位于文件的第一行中),所以我们删除了server00.log。

 

2.10临时文件命名与随机数