现在的位置: 首页 > 综合 > 正文

强大的UNIX命令行

2013年12月03日 ⁄ 综合 ⁄ 共 1477字 ⁄ 字号 评论关闭

作者:张彪

 

 

我们传统的写程序办法是造单一而功能全面的程序,设法在一个程序里提供能够全面满足需求的功能,这样的做法会造成程序庞大而复杂,可维护性降低。Windows上的程序通常如此,具有全面的功能,基本上不考虑与其他程序的配合,比方说有两个程序都需要分页,他们会各自开发一个分页模块,而不是去寻求共用分页功能。在UNIX世界里的做法与之相反,每个程序只做单一的功能,除此之外不做任何多余的事情。复杂的功能通过多个程序之间配合完成(通过管道)。相信经常使用UNIX命令行工具的人会经常为它的强大和灵活而感到深深的震撼和佩服。举个例子:

一个文件里存有很多url,每行一个url,其中不少url是重复出现的(比如某网站的access log,有些url被多次访问)。如何从中提取出前10名访问最多的url

$ sort access.log | uniq -c | sort -rn | head

 

第一个sort负责排序,把相同的url都聚在一起;uniq -c计算出每个url的出现次数,并把出现次数的值附加在每个url前面;第二个sort按每个url出现的次数从高到底排序;head取其中的前10url

这是一次完美而漂亮的配合。每个命令都各司其职,做好自己的事,但每个命令对整体要做的事情都一无所知,它们知道的是一些数据进来,处理之,然后把一些数据输出去。这些命令组合在一起,就完成了你想要完成的功能。

 

 

shell命令的组合可以做的事情数不胜数,再举几个例子:

查看当前文件系统的磁盘空间主要耗费在哪里?

$ du --max-depth=4 /home|sort -nr |more

根据正则表达式去kill特定的进程:

$ ps xww | grep "sleep" | cut -c1-5 | xargs -i kill {} 2>/dev/null

一个可以即时编译运行的C程序:

$ echo 'main() {printf("Hello/n");}' | gcc -w -x c -; ./a.out

 

等等。。。

 

很多事情在其他操作系统上完成比较笨拙或困难,要么不得不自己编程去做,要么求助于专门工具。而在UNIX系列操作系统上仅仅轻敲几个命令就可以搞定,这也是UNIX/LINUX深受喜欢的原因之一。

 

 

那么,这样的威力和灵活性从哪里来?

1,每个命令只做一件事,相当于提供了基本功能;

2,提供了灵活的组合手段,通过管道配合来组合各个命令的功能完成整件事情。

 

这些程序可以无缝地配合的原因是,所有命令共同遵守统一的输入输出表示(对于每个命令程序来说,输入的内容都是以换行符分隔的文本,工作方式都是一行一行的处理,输出时同样是以换行符分隔的文本,这就确保了输出的结果可以作为遵守同样约定的程序的输入,从而提供了无缝的组合手段)。这样的方式同样也提供了扩展的能力,在特定的情况下,如果现有的命令仍然不够用,你很容易添加新的命令,只要你编写的程序遵守同样的约定,就可以与现有的UNIX命令完美配合。

 

按照语言的三要素来说(基本要素,组合手段,抽象手段),UNIX命令行至少提供了其中两个要素(基本要素,组合手段)。因此它可以灵活的完成很多工作。

 

PS

统一的表示威力是强大的。

Lisp语言中,一切数据都是list,甚至Lisp代码本身也表示为一个listLisp提供了内建的对list的操作,其强大和灵活使Lisp风靡半世纪而不衰(包括Lisp的后继schemecommon Lisp)。

据说六七十年代有一门深受程序员喜爱的语言,名叫APL,在这门语言里所有的数据都是数组,而且为各种类型的通用数组操作提供了一套统一而方便的运算符。

 

抱歉!评论已关闭.