shell脚本学习指南[二](Arnold Robbins & Nelson H.F. Beebe著)

2019-09-23 09:42:16于海丽

另外我们处理大量这样的数据的时候,我们需要重新格式化段落以方便我们使用或阅读。这时候可以使用fmt命令,有两个常用的选项:-s 仅切割较长的行,短行不会合并 ; -w n 则设置输出行宽度为n个字符(默认75个左右)。要考虑fmt移植性的请另行查询文档。

这里对可能使用到的统计行数、字数、字符数的wc命令做一个介绍,选项有-c 字节数 -l行数 -w 字数 。默认情况下给出行数 字数 字节数。

好了,处理了那么多文本,我们可能要打印出来看看,unix里支持的打印功能包括两类不同的命令,但拥有相同的功能,商用的unix系统与GNU/linux通常两种都支持,不过BSD系统仅支持Berkeley风格,POSIX则只定义了lp命令。


Berkeley System V 用途
lpr lp 传送文件到打印队列
lprm cancel 从打印队列中删除文件
lpq lpstat 报告队列状态

两套命令的例子:


$ lpr -Plcb102 sample.ps #将PostScript文件传送给打印队列lcb102
$ lpq -Plcb102 #查看打印队列状态
$ lprm -Plcb102 81352 #停止此进程!结束这个作业

然后是System V风格的:

$ lp -d lcb102 sample.ps #传送PostScript文件到打印队列lcb102
$ lpstat -t lcb102 #查看打印队列
$ cancel lcb102-81355 #结束这个作业

有时需打印数据需要加上页码或者时间戳,可以使用pr预处理要打印的数据。
语法:pr [ options ] [ file(s) ]
主要选项:
-cn 产生n栏的输出,可以简化成-n
-f 在首页之后的每一页标题前置一个ASCII分页字符标题,(有的环境下是-F)
-h althdr 将页标题内的文件名称,改用字符串althdr取代。
-ln 产生n行的页面
-on 输出位移n个空白
-t 不显示标题
-wn 每行至多n个字符。以单栏输出而言,如有需要会将较长的行切分绕回至另外一行;否则,在多栏输出的情况下,会截去长的行以符合指定。样例:
pr -f -l60 -o10 -w65 file(s) | lp 。

还有其他打印工具,这里说的比较简单,有这方面需求可以再搜些文档看看。

第五章管道的神奇魔力
在linux下的管理性文件,大部分都是文本文件,可以直接编辑阅读的,这些文件大部分放在标准目录:/etc下。我们写shell脚本的时候大部分时候都是在处理文本信息,而管道是可以一直顺序着连着使用的 如 .... | ... | ... 这样,书中举了个连着使用5个管道的处理passwd文件的例子说很厉害,大致就是这样。然后又写了一个脚本把文本转化成HTML文件。然后又弄了一个根据正则匹配的脚本来帮助玩文字解密游戏。再然后通过管道计算出了各种莎士比亚基本的单词出现频率等。管道的神奇就不罗嗦了。

第六章变量、判断、重复动作
有两个相似命令提供变量的管理,一个是readonly,可以将变量设置为只读模式,就是成为符号常量。export用于修改或者打印环境变量。他们都由一个-p选项,意思是打印命令的名称以及所有被导出(只读)变量的名称和值,这种方式可使得shell重新读取输出以便重新建立环境(只读设置)。