感谢支持
我们一直在努力

命令导向让Unix系统命令一气呵成

    在Unix中有一个很实用的功能即命令导向功能。简单的是说,命令导向就是可以把几个单独的命令通过导向符号把他们连接起来。如此的话,系统工程师为了达到每个特定的目的,不用在分布去执行某些命令,而可以把这些单独的命令组合起来,一气呵成。


命令导向让Unix系统命令一气呵成


  如上图所显示的ls、>、wc三个命令主要用来统计某个文件夹下特定文件的个数。此时可以通过命令导向功能把三个命令合并成一个ls | wc命令来完成。如现在用户文件夹/mnt/share下总共有八十多个文件夹。但是现在系统工程师要确切知道这个share文件夹下文件夹与文件的确切数字,该怎么办呢?若要一个个去数,也可以。但是这个笨办法的话,比较浪费时间,而且也容易数错。为了达到这个目的,我们可以通过几个相关的命令来实现。


  第一个命令:文件列表命令ls。


  在Window系统中,可以通过dir命令来显示某个特定目录下面的文件夹与文件信息。其实在Unix系统中也有类似的命令,如ls文件列表命令。不过这个命令要比dir命令功能上要强的多。如ls命令后面加入-l参数还可以显示各个文件夹与文件的权限信息。而dir命令没有这方面的功能。利用ls命令可以列出某个特定目录下的文件。如现在系统工程师想要查看文件嘉share下面的文件以及文件夹信息,可以先定位到这个文件夹下,然后使用ls命令来查看所有的文件夹与文件信息。通常情况下,此时文件夹或者文件显示的顺序是按ascll码进行排序的。也就是说,按字母进行排序,并且大写字母会排在小写字母之前。如果这个文件夹下的文件(文件夹)数据不多的话,那么数数的话,也可以比较快的得到正确的结果。但是,若文件(文件夹)比较多的话,如一页还显示不完,此时若靠数的话,显然不能够很快得到正确的结果。此时,就需要通过其他命令来帮助系统工程师来完成这个任务。


  第二个命令:输出重定向功能。


  在实际工作中,系统工程师除了可以在终端输入ls命令的执行结果之外,还可以使用一个特殊的命令“>”(输出重定向命令)把执行结果保存到一个文件夹里。如可以通过ls > total 命令把ls命令显示的结果保存在total文件中。当系统工程师执行完这个命令之后,系统除了在屏幕上出现一个提示符之外,将不会显示任何相关的内容。这就是unix系统下shell外壳的重定向功能。这个重定向功能可以把本来应该在屏幕上显示的内容重定向到一个用户指定的文件中。Shell外壳程序会先对重定向符号前面的命令进行解释并,注意此时只是解释命令但是并不执行。然后shell程序会打开重定向符号后面的文件。第三步才是执行这个命令,并把搜索到的结果保存到用户指定的文件中。如果系统工程师要查看这个文件中的内容,则可以通过cat命令来查询。如cat total就可以查看这个文件中的内容。

  第三个命令:统计文件的行数命令。


  虽然已经通过输出重定向功能,把share文件夹下的所有文件(文件夹)信息保存到了一个特定的文件下。但是,此时系统工程师仍然不能够一目了然的知道文件夹下文件与文件夹的总个数。虽然通过一个个数也可以达到预计的目的,但是这个太麻烦。虽然可以省去ls命令卷屏的麻烦,不过准确率仍然不是很高。此时,系统工程师就需要用到统计文件行数的命令wc。


  当通过输出重定向功能把ls的结果输出到一个文件中后,在存储的时候每个文件夹文件将会是独立的一行。也就是说,如果能够通过相关的命令统计出这个文件的行数字的话,那么这个行数就是文件或者文件夹总的个数。为了达到这个目的,系统工程师就可以通过wc total命令来统计这个文件中的行数。执行这个命令后,系统会显示如下一行内容。


  $ wc total


  85 85 356 total


  可惜的是,Unix的界面不怎么友好。在显示的结果中,没有标明各个字段所代表的含义,在输出的结果中仅仅显示文件的统计数字以及文件名字。这就考验系统工程师的能力了。有一定经验的系统工程,看到这些数字就知道其代表的含义了。具体来说,这三个数字从坐到右分别表示这个total文件有85行、85个单词以及356个字符。可见,这个share文件夹下总共有85个文件或者文件夹。为此不用系统工程师一个个去数,只需要凭借一个简单的wc统计命令,就可以统计出行数,并由此判断出特定文件夹下的文件总和。


  但是,有人会提出疑问,若要统计一个文件夹下面文件以及文件夹的个数,如此劳师动众要执行三个命令,那是否值得呢?确实,这虽然比一个个的去数要方便、准确一点,但是分别执行三个命令毕竟麻烦,而且还会产生中间文件(total)这个垃圾文件。得到结果后还要把这个文件删除,可见确实蛮麻烦的。那么能否采取比较方面的策略呢?


  这就要回到本篇文章的主题,即通过命令导向功能组合系统的相关命令,让各个命令能够一气呵成,直接达到系统工程师的目的。如本文一开始显示的那张图中,可以通过命令导向符号“|”把相关的命令连接起来。如要达到上面这个目的,系统工程师可以先定位到share文件夹下,然后通过ls | wc命令来统计结果。具体的输出如下:


  $ ls | wc


  85 85 356 No filename;


  可见,通过这个命令其达到的效果就是上面三个命令总和。在上面的例子中,笔者先利用文件列表命令ls列出share目录下的文件信息;然后通过输出重定向符号>把输出结果保存到一个文件中;最后通过wc命令统计这个文件中的行数以得到share文件夹下的文件或者文件夹个数。而现在笔者则通过灵活的组合方式,直接求出某个特定文件夹下的文件个数,根本不需要通过中间文件。在上面的输出结果中,也可以看出这个这个命令执行过程中根本没有产生不必要的垃圾文件。那么系统是如何实现这个目的呢?


  虽然以上的显示结果跟利用三个命令的显示结果具有同样的效果。但是他们的内部处理还是有一点差异。利用$ ls | wc命令后,系统并没有把ls命令显示的结果输出到一个临时文件中。而是直接把命令执行的结果导向到wc命令的输入。故在这个过程中就不会产生任何的中间文件。事后也不需要花时间去删除它。在这个命令中使用了“|”符号,用这个符号来连接两个不同的命令,实现把一个命令的输出通过管道导向另一个命令的输入。故我们也把这个特殊的性能叫做命令的导向功能。利用“|” 导向符号可以把多个Unix命令组合起来,来实现一些复杂的管理任务。如果利用的好的话,其作用就不只是简单的统计文件夹个数那么简单。


  在后续的文章中,笔者将谈到很多Unix系统的管理技巧,都需要用到这个命令导向功能。故笔者认为这是Unix系统工程师必须要掌握的一个实用技能。通过这个简单统计文件个数的命令,可以让大家对这个命令导向功能有一个感性的认识。笔者在日常进行Unix系统工程师培训的时候,利用的就是这个例子。若大家对这个命令导向功能还觉得不怎么清晰的话,那么回去按照笔者这个思路操作几遍,相信会有不错的收获。

赞(0) 打赏
转载请注明出处:服务器评测 » 命令导向让Unix系统命令一气呵成
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏