一:临时文件命名与随机数
(1) 创建临时文件
$filename=`mktemp`
上面的代码创建了一个临时文件,并打印出存储在$filename中的文件名
(2)创建临时目录:
$ dirname =`mktemp -d`
上面的代码创建了一个临时目录,并打印出存储在$dirname中的目录名。
(3) 如果仅仅是想生成文件名,又不希望创建实际的文件或目录,方法如下:
$ tmpfile=`mktemp -u`
文件名被存储在$tmpfile中,但并没有创建对应的文件。
(4) 根据模板创建临时文件名:
$mktemp test.XXX
mktemp命令的用法非常简单。他生成一个临时文件并返回其文件名(如果创建的是目录,则返回目录名)。
如果提供了定制模板,X会被随机的字符(字母或数字)替代。注意,mktemp正常工作的前提是保证模板中至少要有3 个x。
二:分割文件和数据
在某些情况下,必须把文件分割成多个更下的片段。我们来看看如何将文件分割成不同大小的多种方法。
例: 假设有一个叫做data.file的测试文件,其大小为100KB。你可以将改文件分割成多个大小为10KB的文件,方法如下:
$ split -b 10k data.file
$ ls
data.file xaa xab xac xad xae xaf xag xai xaj
上面的命令将data.file分割成多个文件,每一个文件大小为10kb。这些文件以xab,xac, xad的形式命名。这表明他们都有一个字母后缀。如果想以数字为后缀,可以另外使用-d参数。此外,使用-a length可以指定后缀长度:
$ split -b 10k data.file -d -a 4
此外,如果想自己指定前缀,可以在上面这个命令的结尾再加上自己的前缀格式,即可。
$split -b 10k data.file -d -a 4 split_file
$ ls
data.file split_file0002 split_file0003 split_file0004 ....
如果不想按照数据块大小,而是需要根据行数来分割文件的话,可以使用-l :
$ split -l 10 data.file
# 分割成多个文件,每个文件含10行
另一个有趣的工具是csplit。他是能够依据指定的条件和字符串匹配选项对日志文件进行分割。来看看这个工具是如何运作的。
csplit是split工具的一个变体、split只能够根据数据大小或行数分割文件,而csplit可以根据文件自身的特点进行分割。是否存在某个单词或者文本内容都可以作为分割文件的条件。
看一个日志文件的的实例:
我们需要将这个日志文件分割成server01.log, server02.log 和 server03.log,这些文件的内容分别曲子源文件中不同的SERVER部分。那么,可以使用下面的方法来实现:
$ csplit server.log /SERVER/ -n 2 -s {*}
-f server -b "%02d.log"; rm server00.log
有关这个命令的详细说明如下。
/SERVER/ 用来匹配某一行,分割过程即从此开始。
/[REGEX]/ 表示文本样式,包括从当前行(第一行)直到(但不包括)包含“SERVER”的匹配行。
{*} 表示根据匹配执行重复分割,直到文件末尾位置。可以用{整数}的形式来制定分割执行的次数。
-s使用命令进入静默模式,不打印其他信息。
-n指定分割后的文件名后缀的数字个数,例如01,02,03等。
-f 指定分割后的文件名前缀(在上面的例子中,server是前缀)。
-b指定后缀格式。例如%02d.log,类似C语言中printf的参数格式。在这里文件名=前缀+后缀=server+%02d.log。
因为分割后的第一个文件没有任何内容(匹配的单词就位于文件中的第一行),所以删除了server00.log