全部博文(60)
分类:
2010-06-12 11:25:47
首先明确不同的程序语言用于不同的需求,Shell脚本常用于系统管理工作。
------------------------------------------------------------------------
脚本语言和编译型语言的差异-->
对于编译型语言的好处是高效,缺点则是:它们多半运作于底层,所处里的是字节、整数、浮点数或是其它机器层级的对象。比如说,在C++里,很难进行“将一个目录里所有的文件复制到另一个目录中”之类的简单操作。
对于脚本语言的好处是,它们多半运行在比编译型语言高的层级上,能够轻易处理文件与目录之类的对象。缺点是:效率不如编译型语言。针对不同的需求,应该选择合适的方法完成任务,不必大费周折。
-------------------------------------------------------------------
脚本编程语言的例子很多,有perl,pyton,ruby,shell等,因为shell是各unix系统之间通用的功能,并且经过了POSIX的标准化,因此用心写一次shell,就能应用到很多系统上。
写shell脚本之前,应该熟知系统常用的命令,因为shell脚本的骨架就是由命令搭建起来的。
-------------------------------------------------------------------
作为shell编程的开始,最基础的就是文本操作,查找与替换。还应该学习正则表达式,它是某些系统工具的基础。
正则表达式分为一般字符和特殊字符,特殊字符又称为元字符(metacharacter)。
.(点号)匹配任一字符,*匹配之前任意数目(包括0)的单个字符,[xxx]匹配方括号中的任一单个字符,若方括号首字符为^,则匹配的字符不包括方括号内的。
一般字符表示它本身,而特殊字符若想表示它本身,需要转义,即反斜杠\。
^xxx匹配行开头为xxx的字符串,xxx$匹配行结尾为xxx的字符串。
注意到*匹配单个字符的任意数目,而没有限制,所以出现了区间表达式\{ \},可以明确表示所需匹配的次数:
\{n\}匹配n次,\{n, \}至少n次,\{n, m\}n至m次。且n和m的值必须介于0和RE_DUP_MAX(含)之间,通过getconf命令可以获得系统设定的RE_DUP_MAX,getconf RE_DUP_MAX。
^和$这两个特殊字符成为锚点(anchor),’^$’匹配空行,非常好用,可以结合grep -v预先去除空行。注意^$仅在起始和结尾处具有特殊字符。
以上讨论的是BRE(基本正则表达式),另外还有ERE(扩展正则表达式)。
?匹配0个或1个前置正则表达式,+匹配一个或多个前置正则表达式。
|(管道符)交替:匹配一系列字符串,如fast|slow|shutdown,优先级最低。
(…)分组:和交替结合使用。注意这里的圆括号不是匹配字符,而是充当特殊字符。
与BRE不同的是,在ERE中,^$永远是meta字符,无论是在起始还是结尾处。
\<匹配单词的开始,\>匹配单词的结束。
GREP程序在文本中查找指定模式,并打印匹配行。grep可以理解为g/re/p(全局性匹配re,并打印)。
SED(stream editor,流编辑器)经常用于文本替换。
对于sed,它并不改变输入的文件,而只是将操作结果输出到标准输出(屏幕),如果想将结果保存,则需要重定向。
sed 's/pattern/replace/':该命令只匹配本行第一次出现的模式,用s命令查找正则表达式,用replace替换pattern。斜杠为分界定位符,也可以是其他的标点符号,如分号,逗号等。
sed -e 'command-line1' -e 'command-line2' ...说明-e选项可以携带多个sed命令。
sed -f text.sed file.txt1 > file.txt2 说明-f选项后跟sed命令文件(sed命令写在同一个文件中),作用于输入文件,结果输出到txt2中。
sed 's/pattern/replace/g'中,s命令表示搜索模式,g命令表示全局搜索,如果不加g命令则只搜索第一个匹配成功的字符串。
cut(筛选出每行中选定的字段)-c选定字符范围,-f选定字段范围,-d选定分界符。
join 用来结合记录中具有相同键值的字段的文件。
awk 是一种编程语言,基本功能用于选定字段,或者重新安排字段顺序。文件中存在多条记录,每条记录对应多个字段。每个字段用分隔符隔开,分隔符可以是空白,也可以是其他符号。awk 'pattern' {action} [file], -F选项说明了字段分隔符,-v ‘OFS=value’将value作为输出的分隔符。action动作可以是print $1即表示打印第一个字段的值,$0表示整条记录,$NF表示字段的个数。