a brief talk about bottom-up shell script programming and … · 2016. 6. 19. · a brief talk...

5
2011 年第 2 JISUANJI YU XIANDAIHUA 总第 186 文章编号: 1006-2475( 2011) 02-0073-04 收稿日期: 2010-11-04 作者简介: ( 1983- ),男, 龙海人, 厦门大学计算机科学系硕士研究生,研究方向: 数与数挖掘,开与开发ShEll 本编 程及 效率 ( 厦门大学计算机学系, 厦门 361005) 摘要: ShEll 模式并不的程序效率使数据量文本分析 时的资源消耗本文通过分析 ShEll 语言应用需求计的度提出 进行 ShEll 提出系统环境模式掌握工具,自ShEll 思想法能够效提高本的效率关键词: 本; 正则; 中图分类号: TP311. 1 文献标识码: A doi: 10. 3969 / j. issn. 1006-2475. 2011. 02. 020 A Brief Talk about Bottom-up Shell Script Programming and Efficiency Optimization JIANG Song-boNI Zi-wEi ( DEpartmEnt of ComputEr SciEncEXiamEn UnivErsityXiamEn 361005China) Abstract: ShEll scripts run in thE intErprEtEr modEwhich has always bEEn inEfficiEnt. InEfficiEnt dEsign will furthEr affEct thE Effi- ciEncy pErformancE of thE ShEll script. This papEr analyzEs thE charactEristics of ShEll languagE and its applications and proposEs a bottom up to ShEll scriptingidEa basEd on thE pErspEctivE of hiErarchical dEsign. At thE samE timEthis papEr puts forward a comprEhEnsivE mEthodthat is from thE ExtErnal systEm EnvironmEntto intErnal ExEcution modElto mastEring ShEll utilitiEs. ThE casE fully provEs that thE idEa and mEthods about bottom-up ShEll scripting can EffEctivEly improvE thE EfficiEncy of thE script. Key words: script; rEgular; pipElinE 0 Unix 多年ShEll 成为 计算机 ShEll 本编程以其简便的特广泛应用于ShEll 本编程已是1992 IEEE 过了ShEll and utilitiEs IEEE Std 1003. 2-1992 POSIX. 2 2001 IEEE Std 1003. 1-2001 ShEll 及由其内( built-in ) 和其应用程序等成的 ( utilitiEs) 接口ShEll 开发程为: 基于 ShEll 程序述工形成处理程序的 ShEll ShEll 使 ShEll 开发 具有 掌握 ShEll 本编ShEll 同时 掌握 find / sEd / awk / grEp 等各种1 Shell 高效ShEll 不仅是出优秀程序 高效程序的满足应用ShEll 是一种解考虑程序的效率上比不上 C 程序其所具有的简便的特使其 的自动化应用处理之信息

Upload: others

Post on 02-Jan-2021

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: A Brief Talk about Bottom-up Shell Script Programming and … · 2016. 6. 19. · A Brief Talk about Bottom-up Shell Script Programming and Efficiency Optimization JIANG Song-bo,NI

计 算 机 与 现 代 化2011 年第 2 期 JISUANJI YU XIANDAIHUA 总第 186 期

文章编号: 1006-2475( 2011) 02-0073-04

收稿日期: 2010-11-04作者简介:江松波( 1983-) ,男,福建龙海人,厦门大学计算机科学系硕士研究生,研究方向: 数据库与数据挖掘,开放式系统管理与开发。

浅谈自底向上的 Shell脚本编程及效率优化江松波,倪子伟

( 厦门大学计算机科学系,福建 厦门 361005)

摘要:低效的 Shell脚本设计会进一步影响原本解释器模式下并不见长的程序运行效率,使其在面对大数据量文本分析时的资源和时间消耗变得难以接受。本文通过分析 Shell语言及其应用需求的特点,从分层设计的角度提出“自底向上进行 Shell脚本编程”的理论,同时提出从“外部系统环境”到“内部执行模式”全面地掌握工具软件的方法。实例充分证明,自底向上的 Shell脚本编程思想及方法能够有效提高脚本的执行效率。关键词:脚本; 正则; 管道中图分类号: TP311. 1 文献标识码: A doi: 10. 3969 / j. issn. 1006-2475. 2011. 02. 020

A Brief Talk about Bottom-up Shell Script Programming and Efficiency Optimization

JIANG Song-bo,NI Zi-wei

( Department of Computer Science,Xiamen University,Xiamen 361005,China)

Abstract: Shell scripts run in the interpreter mode,which has always been inefficient. Inefficient design will further affect the effi-ciency performance of the Shell script. This paper analyzes the characteristics of Shell language and its applications and proposes a“bottom up to Shell scripting”idea based on the perspective of hierarchical design. At the same time,this paper puts forward acomprehensive method,that is from the“external system environment”to“internal execution model”,to mastering Shell utilities.The case fully proves that the idea and methods about bottom-up Shell scripting can effectively improve the efficiency of the script.Key words: script; regular; pipeline

0 引 言伴随着 Unix四十多年的发展,Shell 已经从最初

的命令解释器发展成为现今强大的计算机语言,Shell脚本编程以其简便快捷的特色广泛应用于日常系统管理操作上,熟悉并精通 Shell 脚本编程已是系统管理员必备的技能。

1992 年 IEEE通过了关于“Shell and utilities”的IEEE Std 1003. 2-1992 标准,即 POSIX. 2 标准,并于2001 年合并至 IEEE Std 1003. 1-2001。该标准给出了关于操作系统支持的 Shell命令解释器及由其内置命令( built-in) 、系统工具和其它应用程序等组成的工具软件( utilities) 的标准接口。

Shell脚本开发的编程过程为: 基于 Shell 结构化程序设计语言,并通过调用上述工具软件,形成类似

命令批处理程序的 Shell 脚本。Shell 与工具软件的紧密联系使得 Shell 脚本开发具有鲜明的“自底向上”编程风格。掌握 Shell脚本编程既要熟悉 Shell程序设计语言,同时也要熟练掌握 find /sed /awk /grep等各种工具软件。

1 Shell脚本优化的意义编写高效的 Shell 脚本,这不仅是出于优秀程序

员对精简高效程序的追求,更为了满足实际的应用需求。Shell是一种解释型语言,尽管从执行方式方面考虑,解释型程序的效率上比不上 C 语言等编写的编译型程序,但脚本其所具有的简便快捷的特点使其能够有效实现对系统任务和重复性任务的自动化管理操作,普遍应用在日常的数据处理之中。

系统管理员在进行系统信息采集或网站日志处

Page 2: A Brief Talk about Bottom-up Shell Script Programming and … · 2016. 6. 19. · A Brief Talk about Bottom-up Shell Script Programming and Efficiency Optimization JIANG Song-bo,NI

74 计 算 机 与 现 代 化 2011 年第 2 期

理中经常要面对从上百万或更大数据量的文件中提取、分析数据的需求,实际上优化 Shell脚本效率的效用直接体现在这种大数据量的文本处理上。低效的Shell脚本设计会进一步影响原本解释型执行模式下并不见长的 Shell 脚本运行效率,特别是在面对大数据量文本分析时的资源与时间消耗变得难以接受。

此外,程序的优化需要有针对性,盲目的优化是费时费力的。“过早的优化,是万恶之源”。算法大师 Donald E. Knuth曾分析到: 程序员经常会由于预先的判断错误把 97%的时间花费在优化非关键模块的效率之上,却只花了 3%的时间在关键模块上。因此,过早的优化是没必要的,只有确定了关键模块的真正所在,对其进行的优化才是有价值的。如何有针对性的去优化 Shell脚本,提高脚本执行效率?

2 Shell脚本优化的方法从 Shell的编程模式来看,Shell 结构语言与各应

用软件紧密结合的特色使 Shell编程具有鲜明的自底向上的编程风格。Shell和系统分别提供各种内置函数和工具软件,这些工具软件相当于程序设计中可重用的模块代码,并且是采用 C 语言等语言开发的高效模块。这些工具软件的使用大大弥补了 Shell作为解释器在效率上的缺陷。同时尽管在应用需求上存在交叉,不同的工具具有不同的执行模式,使其在解决同一个需求也存在效率上的差别。因此,采用何种工具直接影响 Shell脚本的执行效率。

下面是一个工具软件应用效率的体现实例:需求: 计算 1 到 100000 累加结果。方法 1:采用 BASH Shell的数值计算。#time for( ( i = 0; i < = 100000; i ++ ) ) ; do ( ( sum += i) ) ;

done; echo S| sumreal 0m1. 134suser 0m1. 080ssys 0m0. 048s5000050000

方法 2:采用 awk的数值计算。#time awk 'BEGIN{ while( i ++< 100000) sum += i; printf″%

d″,sum; } '5000050000real 0m0. 029suser 0m0. 020ssys 0m0. 000s

实例结果分析:同等的累加运算,采用 Shell的数值计算耗时 1. 134 秒,采用 AWK 工具只需要 0. 029秒。实验结果表明,适当地采用工具软件,能够明显

提高 Shell脚本的执行效率。“一个程序只做一件事,并做好。程序要能协

作。程序要能处理文本流,因为这是最通用的接口”,Shell脚本开发便是这样一种“自底向上”的编程过程,这种过程既充分体现了 Unix 的编程哲学,也体现了模块化结构式程序的模块化思想及其封装性与紧凑性。这种紧凑性表现在 Shell编程中必备的各种工具内部功能的精简、高效和无冗余。Shell 充分利用了这些工具,提高了脚本的适用范围。

基于 Shell脚本的“自底向上”的编程风格,可以从工具软件的挑选和应用方向考虑优化程序效率。而工具软件的挑选与应用,离不开以下两点:

( 1) 系统原理知识的了解及应用。( 2) 工具软件的执行模式的了解及应用。系统是工具软件的外部条件和应用环境,执行模

式是软件的内部环境,只有由里到外对工具软件进行全面的了解,才能够结合实际需求和设计,提高脚本执行效率。

3 Shell脚本优化实践

3. 1 实验环境

据 China Unix 论坛的 Shell 版非正式的统计,在304人中有 260的人“用 BASH多一些”,占 85%以上。BASH最新发布的稳定版本是 4. 1,但当前各 Linux 发行版中大部分还是使用 3. 2 版本。因此,本文实例测试环境采用 VMware 虚拟机安装的 RH Linux 系统、GNU的 BASH和 AWK/SED等主流自由软件。

高效 Shell脚本的基础是各种工具软件的应用,在工具的掌握过程中,有些知识点是通用的,比如操作系统原理和管道、正则等应用技巧; 有些是工具自身的特色,比如执行模式、内部数据结构、哈希数组等。只有将这些知识点融会贯通,在面对各种需求时,才能从本质上明白工具间的执行效率差别的原因,并以此来确定采用何种适合的工具。

3. 2 系统原理及应用

3. 2. 1 文件系统了解操作系统相关原理能够帮助更好地理解、掌握

并应用工具软件。首先以文件系统为例,只有了解Linux的根文件系统,才能更好地理解 find 命令查找文件时的深度优先查找方式。再比如: 通常 Linux 文件系统包括存放于文件索引列表的文件相关信息和存放于磁盘数据块中的实际数据。有部分命令是采用索引列表里的文件信息,有些命令则需要去遍历数据。根据需求采用适当的工具才能提高脚本执行效率。

Page 3: A Brief Talk about Bottom-up Shell Script Programming and … · 2016. 6. 19. · A Brief Talk about Bottom-up Shell Script Programming and Efficiency Optimization JIANG Song-bo,NI

2011 年第 2 期 江松波等:浅谈自底向上的 Shell脚本编程及效率优化 75

实例 :文件系统应用。需求: 计算定长大数据量文件的总记录数。方法 1:采用 wc命令,在文件遍历过程中累计文

件记录数。方法 2:采用 ls 命令,读取索引中的文件大小信

息,除以单条记录长度即可获得总记录数。实例结果分析: 方法 2 的效率在于充分利用了文

件系统和需求,减少了文件 I /O和遍历计算。在大文件处理中的效率提高程序尤为明显。3. 2. 2 管道

管道是 Unix及其兼容系统中最早也最通用的进程间通信( IPC) 手段,Shell采用管道线简便实现了管道应用,管道已经普通采用于各种 Shell脚本程序中。

只有了解文件系统,多进程编程等相关知识方能更好地掌握管道的应用。管道实质上是内核基于在内存中构造的管道文件系统( PIPEFS) 实现的。父子进程一端采用只读方式打开文件,另一端采用只写的方式。命名管道则是进一步利用了文件系统,使应用管道的进程脱离了父子关系的限制。另外,BASH 中的每一条的管道都是在其子进程环境中运行。基于进程间环境的独立性,管道内的变量操作并不会对父进程同名变量产生影响。

通过管道线将多个存在数据流依赖的命令进行重定向和连接,既实现了进程间通信,又避免了数据流落地产生 IO消耗和临时文件处理工作。3. 2. 3 正则

Shell中的正则是形式语言学中正则语言理论的实际应用。形式语言探究的是语言的内容和规则的严格论证。构成语言的基本要素是字符集和在其之上的语法定义。Shell中存在的诸多正则标准或称流派便是根源于各标准支持的不同的元字符定义和对基本规则的扩展;此外正则表达式的应用过程分为分析、编译、执行三个过程。通常将正则在这过程中所采用的不同的数据结构与匹配算法归类为不同的正则引擎,主要包括 DFA和 NFA两种方式。DFA 正则引擎采用确定型有限自动机模型,对每个输入字符都有确定的输入状态,对于字符串只需一遍扫描即可完成算法。所以 DFA 引擎效率较高,但支持的功能较少;后者采用非定型有限自动机模型,增加了回溯机制,使得能够支持环视、非贪婪等功能,但也因为回溯影响了效率。

正是基于不同的正则标准使得正则表达式总是要在复杂性、效率与准确性三点进行平衡。一般来说,对于相同目的正则表达式复杂度会随准确性的提

高影响效率。不同的工具软件支持的正则标准也存在差别。如何优化正则是一个较大的难题,可以参考《精通正则表达式》一书。

正则是文本匹配的利器,被广泛应用于字符串匹配之中,而字符串匹配往往是进行文本增加、删除、修改、查询等操作的基础。从效率上考虑,尽管正则使用起来十分方便,但出于效率考虑,正则却未必是最好的选择。在实际的 Shell脚本开发中,需要了解各种工具所支持的正则标准和正则匹配脚本在运行中占用的时间比。在开发过程中结合实际需求,考虑是否需要采用正则,然后再考虑采用哪种工具哪种正则标准。

实例:正则效率。需求: 某文本以空格和“/”进行分隔,获取第 5

列的内容。方法 1:采用正则“/”分别匹配两种分隔符,取得

第五列。#time awk-F'[/]''{ print S| 5} 'a. txt > /dev /null

real 0m17. 717suser 0m14. 749ssys 0m2. 844s

方法 2:实际数据分析中发现,可以采用单字符解析的方式,首先根据“空格”分隔符取得第 4 列,再利用“/”分隔符取得第 2 列。

#time awk' { print S| 4 } ' a. txt | awk-F / ' { print S| 2 } ' > /

dev /nullreal 0m0. 565suser 0m0. 224ssys 0m0. 688s

实例结果分析: awk 采用-F 指定分隔符,在多分隔符情况下,会启用正则去解析记录,增加了函数调用和字符串匹配的消耗,效率上理所当然地比不上默认的空格或单字符分隔符采用简单的字符比较方式,尽管如此,方法 2 依赖于对需求的进一步分析,适用的需求范围没有使用正则那么简便灵活。

3. 3 了解软件执行模式

执行模式涉及工具内部的程序流程和处理逻辑,不同的程序一般具有自身的执行模式,但同时也遵守一些通用的标准。比如《GNU Coding Standards》( Richard Stallman,1993 ) 一文中关于 GNU 兼容接口提到一点:如果程序按行读取输入,则应该每次只在内存中保留一行,以便于支持大文件操作。实际上,很多工具软件正是采用这种方式进行处理。比如grep、awk、sed 等命令的一般执行模式便是每次读取一行输入,再执行指定的操作,保证了程序执行时的

Page 4: A Brief Talk about Bottom-up Shell Script Programming and … · 2016. 6. 19. · A Brief Talk about Bottom-up Shell Script Programming and Efficiency Optimization JIANG Song-bo,NI

76 计 算 机 与 现 代 化 2011 年第 2 期

低内存消耗。在 Shell编程的各种应用工具,用以文本处理的

较为常用的命令以 sed和 awk为典型代表,其执行模式也颇具特色。3. 3. 1 sed执行模式及效率优化

sed是一个 POSIX. 2 标准支持的流编辑程序。sed在执行过程中利用两个可以操作的空间: 模式空间和缓冲空间,和一个可控制的操作循环 ( cycle ) 。sed执行模式是基于这样一个循环操作: 读入一行文本进入模式空间并执行操作,直到输入结束或主动退出。

sed的魅力在于利用这两个空间和操作循环所进行的运算及由此产生的强大功能,这种强大功能充分体现在 sed 运算的图灵完备性:单个 sed 命令可以模拟所有图灵运算。简单地说,单个 sed 命令可以实现任何运算任务。尽管如此,限于 sed 的执行模式和效率考虑,一般情况下不将 sed 用于文本操作外的计算比如数学运算等,sed 通常应用于文本的查询、替换、过滤等操作。

了解了 sed的执行模式,就可以通过控制 sed 的循环,采用合理的程序逻辑以提高命令执行效率。

实例: sed应用,读取指定行。方法 1: sed-n'45,50p'filename。方法 2: sed-n'51q; 45,50p'filename。实例结果分析: 方法 2 在方法 1 基础上增加了一

个判断,当文件读取到第 51 行时即时退出。避免文件后续部分的遍历,在大数据量处理上能够极大地提高执行效率。

实例: sed应用,文本替换。方法 1: sed's / foo /bar /g'filename。方法 2: sed' / foo / s / foo /bar /g'filename 。实例结果分析: sed 支持采用正则进行匹配和替

换,在考虑字符串替换的需求中,不防加上地址以提高速度。实例中通过增加一个判断逻辑,采用“事先匹配”代替“直接替换”,由于 sed 会保留前一次的正则匹配环境,不会产生冗余的正则匹配,因此方法 2具有比方法 1 更高的效率。3. 3. 2 awk执行模式及效率优化

awk不只是一个应用工具,还是一种语法和程序结构类似于 C 语言的高级编程语言,可以用来开发包括数学运算、字符串处理等运算功能。awk 的执行模式是基于这样一个循环: 先从输入中获取一条记录,然后根据 pattern真假决定是否执行 action,pattern是对数值运算或文本匹配结果的逻辑判断,action 是

由 awk的编程语言定义支持的各种操作程序,awk 支持用正则进行字符串匹配操作。

awk的效率体现在其类似于 C 语言的高效的主体程序结。awk采用了 yacc的 yyparse对 awk脚本进行解析并形成 node 结点树,再采用了由 C 语言编写并且编译完成的 awk 主体程序树进行递归遍历。这种执行方式,使得 awk 既有解释程序的便捷,又有编译程序的效率。

上述实例介绍了采用 awk 进行高效的数值计算和文本分析。下面着重介绍 awk的特色数据结构:哈希数组,也称关联数组。哈希数组中的每个单元包括两个元素: 单元键 ( key) 及单元值 ( values) 。哈希结构的效益体现在以较小的内存空间实现大的数据空间上的数据存放,节省了数据占存空间; 同时哈希数组中的数据访问是随机访问,不需要遍历而直接通过哈希函数访问数组单元取值,节省了数据查询时间。

实例:哈希应用。需求: 分析 apace 日志,获取访问量较大的前十

个 IP地址。方法: awk‘{ ips[S| 1]++ ; } END { for ( ip in ips) print

ip,ips[ip]}’| sort-nk2 | head-10。

实例结果分析:该 apace 日志首列保存 IP 信息。过 awk对日志进行一次遍历,即实现了 IP 信息的获取,同时采用哈希结构,对 IP进行了累计。

4 结束语没有最好的语言,只有较合适的语言,本文在适

当的需求下讨论了 Shell脚本的自底向上的编程风格及其效率优化的必要性,介绍了 Shell脚本密切相关的系统知识及常用工具软件的执行模式,通过实例说明了了解这些并适当的挑选和应用工具软件可以有效地提高 Shell脚本的执行效率。需求分析与设计逻辑这两者在程序效率优化中也是至关重要的,限于篇幅没有具体展开。此外,Shell 脚本编程有其局限性与适用的需求范围,若在此范围之外,或对效率有进一步要求的情况下,还是需要考虑采用 C、PERL等完善的程序设计语言。

参考文献:[1] Knuth Donald E. Structured programming with go to state-

ments[J]. Computing Surveys,1974,6( 4) : 261-301.[2] Friedl Jeffrey E F. Mastering Regular Expressions[M]. O’

Reilly Media,2006.[3] Herold. Sed & Awk[M]. Addison Wesley Publishing Com-

pany,1991. ( 下转第 80 页)

Page 5: A Brief Talk about Bottom-up Shell Script Programming and … · 2016. 6. 19. · A Brief Talk about Bottom-up Shell Script Programming and Efficiency Optimization JIANG Song-bo,NI

80 计 算 机 与 现 代 化 2011 年第 2 期

目进行了测试。下面以不可达代码故障为例给出部分测试结果,如表 1 所示。

表 1 测试结果统计表

项目编号 源代码行数 unreachable code 每千行源代码故障数

1 43799 8 0. 183

2 51455 16 0. 311

3 55863 12 0. 215

4 90112 37 0. 411

5 78836 29 0. 368

合 计 320065 102 0. 319

测试代码的总行数有32万余行,从中找到102个不可达代码故障,每千行源代码中有 0. 319个该类故障,这说明在一些开发项目中是存在不可达代码故障的,开发针对这些故障的专用测试工具有其实用价值的。

4 结束语软件测试的目的是为了发现更多的错误,代码测

试是目前软件测试研究的一个焦点,程序代码中隐含的错误对软件安全造成了潜在威胁,降低了软件质量及可靠性。本文提出的这种静态测试方法通过对源程序进行静态分析,生成与程序对应的抽象语法树,通过建立程序语法树,匹配软件故障模型,遍历控制流图,针对故障采用的检测算法,自动查找程序中存在的各种故障。经过测试工具分析,虽然也不能保证找出程序中所有的此类故障,但是找到的确实是实实在在的故障,这一点就可以说明这种分析方法的有效性。当然,该测试方法还有很多需要扩展和改进的地方,如:对软件故障的认识需要加深,提高测试算法的准确度,这主要包括两个方面,即提高准确率,减少误报率。

参考文献:[1] 宫云战.一种面向故障的软件测试新方法[J]. 装甲兵

工程学院学报,2004,18( 1) : 21-25.[2] 张海藩.软件工程导论( 第 4 版) [M].北京: 清华大学

出版社,2003.[3] 宫云战.软件测试的故障模型[J]. 装甲兵工程学院学

报,2004,18( 2) : 1-5.[4] 陈志平,徐宗本. 计算机数学[M]. 北京: 科学出版社,

2001: 68-96.[5] 张威.面向故障的软件测试方法研究[J]. 装甲兵工程

学院学报,2004,18( 2) : 6-8.[6] John R levine,Tony Mason,Doug Brown. Lex & Yacc( 第 2

版) [M]. 杨作梅,张旭东,等译. 北京: 机械工业出版社,2003.

[7] Louden K C.编译原理及实践[M].北京: 机械工业出版社,2000.

[8] Bush W R,Pincus J D,Sielaff D J. A static analyzer forfinding dynamic programming errors[J]. Software Practiceand Experience,2000,30( 7) : 775-802.

[9] 王璇.非法计算故障的一种静态测试方法[J]. 计算机工程与设计,2006,27( 14) : 2555-2557.

[10]古乐,史九林.软件测试技术概论[M].北京: 清华大学出版社,2003.

[11]杨朝红.基于模型的软件测试[J].北京化工大学学报,2007,34( I) : 85-88.

[12]高传平. 数组越界的静态测试分析[J]. 计算机工程,2006,32( 3) : 70-72.

[13]曹文静.非法计算故障的自动测试方法[J].武汉大学学报:理学版,2006,52( 5) : 613-617.

[14]高传平.基于抽象语法树的代码静态自动测试方法研究[J].北京化工大学学报,2007,34( z1) :

檴檴檴檴檴檴檴檴檴檴檴檴檴檴檴檴檴檴檴檴檴檴檴檴檴檴檴檴檴檴檴檴檴檴檴檴檴檴檴檴檴檴檴檴檴檴檴

25-29.

( 上接第 76 页)[4] 理曼德( Raymond E S) . Unix编程艺术[M].姜宏,何源,

蔡晓俊译.北京:电子工业出版社,2006.[5] Stevens Richard W. Unix网络编程[M].杨继张译.北京:

清华大学出版社,2000.[6] 郑武,老马. Linux下的 Perl编程[M].北京: 人民邮电出

版社,2001.[7] Anderson Robin,Johnston Andy,等. Unix 技术内幕[M].

周靖,等译.北京: 机械工业出版社,2002.[8] Stevens Richard W,Rago Stephen A. Advanced Program-

ming in the Unix? Environment[M]. Addison Wesley Pro-fessional,2005.

[9] 毛德操,胡希明,等. Linux内核源代码情景分析[M].杭

州:浙江大学出版社,2001.[10] Tanenbaum Andrew S,Woodhull Albert S. 操作系统设计

与实现[M].王鹏,等译.北京:电子工业出版社,1998.[11][美]Johnson Sandra K,Huizenga Gerrit,Pulavarty Badari.

Linux服务器性能调整[M]. 韩智文译. 北京: 清华大学出版社,2009.

[12]邓波,等.精通 Unix Shell脚本编程[M].北京:清华大学出版社,2010.

[13]杨宗德,邓玉春,曾庆华. Linux 高级程序设计[M]. 北京: 人民邮电出版社,2008.

[14] Watt Andrew. 正则表达式入门经典[M]. 李松峰,李丽译.北京:清华大学出版社,2008.