如何在Unix结果中抽取想要的参数
大部分的Unix操作系统命令,其命令执行后都会输出比较详细的参数。但是有时候系统工程师可能不需要这么详细的信息。如date命令,其会显示时间、日期、年数等等信息。但是系统工程师在开发一些应用程序的时候,可能只需要时间信息。为此就需要利用一些工具从中抽取相关的参数信息。其实不光光是在Unix系统管理中,在其他一些程序的开发平台中也会遇到这种情况。而其他一些平台的话,他们则是通过字符串截取或者其他一些类似的方法实现。而在Unix系统中则提供了一些比较专业的命令,用来操作位置参数。如set和shift命令。
在介绍这两个命令的使用要点之前,笔者先给大家看一个截图。如下图所示,这张图就是利用set命令来来操作位置参数。让其从date命令中抽取部分结果。这个特性不仅可以格式化显示结果,而且在shell中开发一些应用程序将会变得很有用。
一、set命令简介。
在Unix系统中,set命令时一个很有用的系统命令,其可以帮助系统管理员实现很多需求,如设置环境变量等等。在这里,其主要是用来实现这支位置参数。其实在Unix系统中,有很多种方法可以用来实现在命令结果中抽取特定的参数。如可以利用外部命令cut实现从一个输出结果中截取一个字段的内容。但是,利用cut命令来实现这个功能的话,就显得有点业余了。既然Unix操作系统提供了其他一些更加专业的命令来实现这些功能,系统工程师为什么要舍近求远呢?
其实在Unix系统中的标准shell中就提供了一些内部命令,来实现功能。其中set命令就是比较有代表性的一个命令。Set命令可以把参数赋值给$1、$2等位置参数。通过情况下,如果系统工程师要从程序的输出结果中提取某些内容则往往是利用这个命令来实现。
二、set命令的具体实现过程以及需要注意的内容。
在谈set命令的具体实现过程之前,笔者先跟大家介绍一些位置参数与命令显示结果之间的关系。了解他们的内在关系是系统工程师使用操作位置参数命令的前提。如上图所示,利用date命令显示出“Mon Apr 20 08:29:40 CST 2009系统的当前时间的结果。这个结果从左到右其对应的存储位置分别为$1、$2等等,以此类推。也就是说,这个显示结果就好像其他开发程序中的数组,系统利用空格来区分字段,并把每个字段的内容依次存入到数组中。不过这里需要注意的是,其他开发程序的数组往往是从0开始。而在Unix系统中,这个位置参数则是从$1开始。为此系统工程师如果要截取第一个字段内容的话,则应该是$1而不是$0。笔者是先学C等开发语言平台,然后再学Unix系统。由于有了一个先入为主的观念,为此后来在使用set命令的时候,经常犯迷糊。故笔者提醒各位系统工程师,在这方面要特别注意显示结果内容与位置参数的对应关系,第一个字段对应的位置参数位$1。了解了这个内容之后,则利用set命令来操纵显示结果则就比较容易了。如上图所示,通常情况下只需要通过简单的两不就可以完成这个功能了。
第一步:利用set命令把它的参数转换为位置参数。
在使用这个命令之前,笔者认为系统工程师应该先明白一个道理。就是默认情况下,命令的输出结果其往往都是显示在终端中,或者通过重定向符号显示在一个特定的文件中。但是无论是哪一种显示方式,其往往不会跟位置参数关联起来。如上图中,一开始运行一个date命令时,会输出相应的时间信息。此时这个输出结果中有6个字段,但是其根本没有跟位置参数形成一一对应的关系。其只是一个简单的字符串而已。如果系统工程师要利用惭怍位置参数命令从这个结果冲抽取内容的话,则一定需要把命令的结果转换为位置参数。而set命令就是用来实现这个目的的。
如利用set ‘date’命令,就可以利用把它的参数结果转化为位置参数。如此设置之后,在显示的结果中系统就会把第一个字段赋值给位置参数$1,第二个字段赋值给位置参数$2,依次类推。在这里笔者再强调一次,第一个位置参数为$1,而不是$0。因为笔者以前犯这个错误犯怕了,所以在这里不厌其烦的强调这个内容,希望能够引起大家的重视。
第二步:利用echo命令来显示位置参数所代表的内容。
把位置参数与输出结果一一对应之后,系统工程师就可以利用echo命令或者在应用程序中直接引用位置参数从某个命令的输出结果中截取相关的内容。通常情况下,系统工程师可以一次抽取一个字段,也可以一次抽取多个字段。而且难能可贵的是,命令中还可以使用通配符。如果系统工程师需要显示所有位置参数所对应的内容,也就是原有命令显示的结果,则可以利用echo $*来实现。通配符*号就表示所有的位置参数。不过需要注意的是,在引用位置参数的时候,要把前面的$美元符号加上去。即echo $1 与echo 1会显示两个不同的结果。前者就是位置参数$1所代表的字段内容;而后者直接显示为1。因为1不是有效的位置参数,而只是把它当作一个简单的字符来处理。
三、set命令的高级应用。
上面举的例子其实只是set命令的一个教学例子。在实际工作中,这主要是用来让大家理解set命令来截取输出结果的基本原理。笔者现在要介绍的就是系统工程师在实际工作中经常要用到的内容,大家要睁开眼看仔细了。
1、从其他文件中或者不规则分隔符的结果中截取字段。如上面所示的输出结果中,各个字段时通过空格符号来分隔的。也即是说,set命令使用的参数分隔符默认情况下采用的是空格符号分隔符。如果显示的结果不是以空格符号分隔的,还是以分号或者横杆来区分的(系统工程师平时遇到最多的就是利用分号或者/符号来分隔的内容),那么就不能利用这个命令了吗?其实系统工程师可以根据实际情况来设置这个分隔符。也就是说,系统工程师可以利用这个set命令来操作位置参数,从而从任何输出结果中(分隔符不同)截取所需要的内容。
2、有利于备份的工作。其实在备份作业中,这个特性就非常有用。如笔者在Unix系统上简易部署了一个文件服务器。在这个服务器上,存储有企业所有员工的日常工作文件。为此其日常的安全就显得非常的重要。此时系统工程师可以采用日被分的方式,把备份文件保存为一个月。也就是说,在系统中创建1-31一共三十一个文件夹。然后把文件服务器中的备份文件按照日期一次保存到这三十一个文件夹中。也就是说1日的备份文件保存在文件夹名字为1的文件夹中,2日的备分文件备份到名字为2的文件夹中,依次类推。这个备份功能程序不难,系统工程师可以编写一个脚本程序来完成。困难的是,系统如何根据当前的日期把备份文件保存到特定的文件夹中。此时就需要用刀这个set命令。系统工程师可以利用set命令来抽取系统日期中的第三个位置参数。然后根据这个参数创建文件夹(创建文件夹时,如果文件夹已经存在,则系统会自动覆盖这个文件夹)。就是这么简单,就可以完成按日来保存备份文件了。可见,利用set命令截取某个输出结果中的内容这是一个基础性的功能。他跟其他命令或者程序结合则可以发挥意想不到的效果。为此笔者建议各位系统工程师,要牢记如何通过set命令来从输出结果中截取必要的参数。或许在什么时候就用的着了。另外需要注意的就是,set命令可以通过各种分隔符来截取相关的字段,而不仅仅只是支持一个空格分隔符,如可以从一个分号分隔的参数文件中获取相关的参数等等。