在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
该进入第四章了,刚才看到一个帖子标题:我空有一身泡妞的好本领,但可惜自己是个妞。汗~这个。。。音乐无国界嘛,这个不应该也没性别界么? 第四章文本处理工具 书中先说明了以下排序的规则,数值的就不用说了,该大就大该小就小,但是字符型很多时候是区分声调或者重音的。在命令行中输入locale查看自己系统的编码配置。默认的是系统配置里的,但是可以自己设置排序的编码。如: 复制代码 代码如下: $ LC_ALL=C sort french-english #以传统ASCII码顺序排序 下边介绍以下排序命令sort: 例子: 复制代码 代码如下: $ sort -t: -k1,1 /etc/passwd #以用户名称排序 $ sort -t: -k2nr /etc/passwd #反向UID的排序 $ sort -t: -k4n -k3n /etc/passwd $以GID与UID排序 关于sort的效率,搞算法的都比较了解目前各种排序算法的效率,这里的sort也没啥特别的,类似STL估计,组合排序算法尽可能的优化过了。不是搞算法的童鞋也不用了解了,相信它的效率就好了。 有时候我们还十分关心排序的稳定性,默认情况下是不稳定的,但是GNU实现了coreutils包弥补了不足,可以通过--stable选项来解决稳定性问题。(不懂稳定性的简单说一下:意思就是排序键值等同的时候需要以输入顺序来输出,即排序不打乱输入顺序) 有时候我们还需要解决输入数据的重复问题,sort -u能够解决一些,但是它消除的操作依据的是匹配的键值,而非匹配的记录。uniq命令提供另一种过滤数据的方式:它常用于管道中,用来删除已适用sort排序完成的重复记录。uniq有3个好用的选项:-c 可在每个输出行之前加上该行的重复次数。 -d选项则用于仅显示重复的行。 -u仅显示未重复的行。这里需要注意一点,uniq处理数据前是需要sort对数据进行排序的! 另外我们处理大量这样的数据的时候,我们需要重新格式化段落以方便我们使用或阅读。这时候可以使用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预处理要打印的数据。 还有其他打印工具,这里说的比较简单,有这方面需求可以再搜些文档看看。 第五章管道的神奇魔力 第六章变量、判断、重复动作 export -p可以显示所有当前的环境变量,如果要从程序的环境中删除变量,则要用env命令,也可以临时的改变环境变量值: unset命令从执行中的shell中删除变量和函数,默认情况下,它会解除变量设置,也可以加上-v完成: 有时候输出某个变量时,希望连接别的字符,可以在变量名左右添加花括号如: 还有一种替换运算符: 以上每个运算符内的冒号(:)都是可选的。如果省略冒号,则将每个定义中的“存在且非null”部分改为“存在”,也就是说,运算符仅用于测试变量是否存在。 还有模式匹配运算符#: 学到这里我们就可以结合之前用到的位置参数来进行一些脚本程序的容错处理了,比如:filename=${1:-/dev/tty} #如果参数1为空则返回/dev/tty 复制代码 代码如下: while [ $# !=0 ] do case $1 in .... #处理第一个参数 esac shift #移除第一个参数 done 另外还有$* ,$@ ,它们一次表示所有的命令行参数。这两个参数可用来把命令行参数传递给脚本或函数所执行的程序。 shift命令是用来“截去(lops off)”来自列表的位置参数,由左开始。一旦执行shift,$1的初始值会永远消失,取而代之的是$2的旧值。$2的值变成$3的旧值,以此类推。$#值则会逐次减一。以上几个要多实验,不再赘述。 类似的还有很多特殊变量:(所有引用特殊变量前边加$符号) shell的算数运算符基本跟C语言一样,想直接在命令行测试算数运算符的需要这样加双括号:echo $(( 3&4 )) 之类的。 有一个要知道的地方,每一条命令,不管是内置的、shell函数,还是外部的,当它退出时,都会返回一个小的整数值给引用它的程序,这就是大家所熟悉的程序的退出状态(exit statu)。在shell下执行进程时,有许多方式可取用程序的退出状态。惯例来讲,退出状态为0表示成功执行完成,其他状态都是失败的。可以用ls命令执行对一次错一次分别看看返回状态是多少(上边有讲特殊变量 $? 可查看上一条命令的返回状态)。 POSIX的结束状态: 令人好奇的是,POSIX留下退出状态128未定义,仅要求它表示某种失败。因为只有低位的8个位会返回给父进程,所以大于255的退出状态都会替换成该值除以256之后的余数。返回值命令:exit value_number 。 关于判断语句 if-then-elif-else-fi 语句给个语法不再赘述: 复制代码 代码如下: if pipeline [ pipeline ... ] then statements-if-true-1 [ elif pipeline [ pipeline ... ] then statements-if-true-2 ... ] [ else statements-if-all-else-fails ] fi if判断力你可以使用 !、&&、|| 等C语言里的这些逻辑判断符号。 复制代码 代码如下: #! /bin/sh #finduser --- 寻找是否有第一个参数指定的用户 if [ $# -ne 1 ] then echo Usage: finduser username >&2 exit 1 fi who | grep $1 关于case语句,给出例子不再赘述,都十分雷同C语言的。 复制代码 代码如下: case $1 in #测试$1 -f ) .... #针对-f选项的程序代码 ;; ##类似break -d | --directory ) #支持长选项 ... * ) #上边都不匹配的默认选项,非必须 echo $1:unknow option >&2 exit 1 ;; #也非必须 esac 关于for循环,给出一个实例: 复制代码 代码如下: for i in atlbrochure*.xml do echo $i mv $i $i.old sed 's/Athlanta/&, the capital of the South/' < $i.old >$i done 这个循环将每个原始文件备份为副文件名为.old的文件,之后再使用sed处理文件建立新文件。同时有输出文件名,作为进度的一种提示。另外for循环里的in列表(list)是可选的,如果省略则遍历整个命令行参数,就好像输入了 for i in "$@" 。 while和until循环也都类似,语法为: 复制代码 代码如下: while condition do statements done until condition 两者不同之处在于如何对待condition的退出状态,只要condition成功,while就继续循环。只要condition不成功,until则一直循环。 shift之前提到过,它还可以接受一个可选参数,也就是要移动几位。 针对参数的处理有一个getopts命令简化了选项处理,它能理解POSIX选项中将多个选项字母组织到一起的用法,也可以用来遍历整个命令行参数,一次一个参数。该命令会自动过滤掉参数里的-,--等符号。如果得到不合法选项字母,该命令会返回一个?符号。 shell脚本里的函数,一般可以定义在程序的最前部,也可以放在另一个独立文件里,并且以点号(.)命令来取用(source)它们。给出一个简单实例: 复制代码 代码如下: # wait_for_user user [ sleeptime ] # #语法:wait_for_user user [ sleeptime ] wait_for_user () { until who | grep "$1" > /dev/null do sleep ${2:-30} done } 调用直接 wait_for_user admin ,还可以接受第二个等待时间参数。在shell函数里,return与exit工作方式相同,可返回一个值,但是需要注意的是在shell函数里使用exit会终止整个shell命令。 |
请发表评论