编写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。
来源:https://www.cnblogs.com/gary-guo/p/6193936.html