Linux shell 脚本攻略学笔记7

来源:互联网 发布:虚拟机里安装linux 编辑:程序博客网 时间:2024/05/21 17:33

一:临时文件命名与随机数

(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$ lsdata.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$ lsdata.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






1 0
原创粉丝点击