




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
概述本文深入介绍基础的 Linux 进程管理技术。您将学习如何: 创建简单的正则表达式 使用正则表达式搜索文件和文件系统 使用正则表达式和 sed本文帮助您准备 Linux Professional Institutes Junior Level Administration (LPIC-1) 考试的 103 主题下的 103.7 考核目标。该考核目标的权值为 2。先决条件为了从本文获得最大的收益,您应该具备基础的 Linux 知识,并且具有一个能够正常运行的 Linux 系统,以便练习本文讨论的命令。不同版本的程序输出的结果的格式可能不同,因此您的结果可能与本文图片和清单所示的结果有所不同。本文以之前的文章 “学习 Linux,101:文本流和过滤器” 中讨论的概念为基础。回页首设置示例联系 IanIan 是我们最受欢迎并且很多产的作者之一。查看Ian 的个人资料并与他和 My developerWorks 上的其他作者和读者联系。在本文中,我们将使用文章 “学习 Linux,101:文本流和过滤器” 中建立的文件练习命令。如果您没有学习该文或者没有保存得到的文件,您可以在名为 lpi103-7 的子目录中新建一个子目录,并创建必要的文件。打开文本窗口,使用主目录作为当前目录。然后,将清单 1 中的内容复制到窗口运行命令,这将创建 lpi103-7 子目录以及您将使用的文件。清单 1. 创建示例文件mkdir -p lpi103-7 & cd lpi103-7 & echo -e 1 applen2 pearn3 banana text1echo -e 9tplumn3tbananan10tapple text2echo This is a sentence. !#:* !#:1-text3split -l 2 text1split -b 17 text2 y; cp text1 text1.bkpmkdir -p backupcp text1 backup/text1.bkp.2您的窗口应类似于清单 2,当前目录现在是 lpi103-7 目录中新建的目录。清单 2. 创建示例文件输出ianattic4:$ mkdir -p lpi103-7 & cd lpi103-7 & echo -e 1 applen2 pearn3 banana text1 echo -e 9tplumn3tbananan10tapple text2 echo This is a sentence. !#:* !#:1-text3echo This is a sentence. This is a sentence. This is a sentence. text3 split -l 2 text1 split -b 17 text2 y; cp text1 text1.bkp mkdir -p backup cp text1 backup/text1.bkp.2 ianattic4:/lpi103-7$ 回页首正则表达式正则表达式在计算机语言理论中有很长的历史。大部分计算机学科的学生都知道,可以使用正则表达式表示的语言与有限时序机(finite automata)可以接受的语言一样。本文中的正则表达式所代表的含义更为复杂,与您在计算机科学课堂上学到的内容可能不同,虽然传承是一样的。正则表达式(也称为 “regex” 或 “regexp”)是描述文本字符串的一种方式或者一种模式,程序可以根据任何文本字符串匹配该模式,以提供强大的搜索功能。grep(正则表达式处理程序的缩写)是 Linux 或 UNIX 程序员或管理员的标准装备,他们可以在文件搜索或命令输出中使用正则表达式。在文章 “学习 Linux,101:文本流和过滤器” 中,我们介绍了sed(流编辑器的缩写),这是使用正则表达式在文件或文本流中查找和替换文本的另一个标准工具。本文将帮助您更好地理解grep和sed使用的正则表达式。使用正则表达式的另一个程序是awk。结合本系列文章中的其他部分您会发现,整本书都是以正则表达式和计算机语言理论为基础的。更多建议请参见参考资料。根据您对正则表达式的了解,您可能发现正则表达式语法与 “学习 Linux,101:文件和目录管理” 中讨论的通配符语法有类似之处。但这种相似之处只是表面现象。回页首基本的构建块大部分 Linux 系统中的 GNU 程序可以使用两种常规表达式语法:basic和extended。使用 GNU grep,功能上没有不同之处。本文将介绍基本的语法,以及它和扩展语法之间的不同之处。正则表达式通过元字符加强的字符和操作符构建。大部分字符与自身匹配,大部分元字符必须使用反斜杠()进行转义。基本的操作包括:连接连接两个正则表达式创建一个更长的正则表达式。例如,正则表达式a匹配字符串abcdcba两次,正则表达式b也是一样。但是,ab将只匹配abcdcba,而ba将只匹配 abcdcba。重复Kleene * 或重复操作符将匹配 0 次或多次前一个正则表达式。因此像a*b之类的表达式将匹配以任何以a开头以b结尾的字符串,包括b本身。Kleene * 不用转义,因此希望匹配字面值星号(*)的表达式必须让星号转义。这里使用的 * 与通配符中使用的 * 不同,通配符中的 * 号匹配任何字符串。交替交替操作符(|)匹配前置或后置表达式。它必须匹配前一个或后一个表达式之一。在基本语法中它必须转义。例如,表达式a*|b*c匹配由任何数量的a或b组成(但不是同时)且以一个c结尾的字符串。同样,单个字符c也是匹配的。尽量不要引用正则表达式以避免 shell 膨胀。回页首搜索文件和文件系统我们将之前的示例中创建的使用文本文件(参见 “设置示例”)。研究清单 3 中的示例。注意grep使用一个正则表达式作为参数,还有 0 个或多个要搜索的文件。如果没有给定文件,grep 将搜索 stdin,这让它成为一个可以在管道中使用的过滤器。如果没有匹配任何行,则grep没有输出,尽管可以测试它的退出代码。清单 3. 简单的正则表达式ianattic4:/lpi103-7$ grep p text11 apple2 pearianattic4:/lpi103-7$ grep pea text12 pearianattic4:/lpi103-7$ grep p* text11 apple2 pear3 bananaianattic4:/lpi103-7$ grep pp* text11 apple2 pearianattic4:/lpi103-7$ grep x text1; echo $?1ianattic4:/lpi103-7$ grep x* text1; echo $?1 apple2 pear3 banana0ianattic4:/lpi103-7$ cat text1 | grep l|n1 apple3 bananaianattic4:/lpi103-7$ echo -e find an ns* here | grep s*s* here从上例中可以看出,有时候会得到出乎意料的结果,尤其是使用重复的时候。您可能预期p*或者pp*能够匹配几个带p的字符串,但是p*和x*能匹配文件的所有行,因为 * 操作符匹配0次或多次前一个正则表达式。有两个示例演示了从 grep 退出的代码。如果找到匹配,则返回值 0。如果发生错误,比如要搜索的文件不存在,则返回大于 1 的值(GNU grep 总是返回 2)。快捷键现在可以使用grep和基本的正则表达式构建块了,以下是一些方便的快捷键。+ 操作符类似于 * 操作符,但是它匹配一次或多次前一个正则表达式。基本表达式中它必须转义。? 表示前一个表达式是可选的,因此它表示匹配 0 次或多次。这与通配符中使用的 ? 不同。.(句点)是表示任何字符的元字符。最常使用的方式是.*,该表达式匹配包含任何字符(或没有字符)的任意长度的字符串。不用说您就明白,这一般在一个较长的表达式中使用。比较句点与通配符中使用的 ?,.* 与通配符中使用的 *。清单 4. 更多正则表达式ianattic4:/lpi103-7$ grep pp+ text1 # at least two ps1 appleianattic4:/lpi103-7$ grep pl?e text11 apple2 pearianattic4:/lpi103-7$ grep pl?e text1 # pe with optional l between1 apple2 pearianattic4:/lpi103-7$ grep p.*r text1 # p, some string then r2 pearianattic4:/lpi103-7$ grep a. text1 # a followed by two other letters1 apple3 banana匹配一行的开始或结束(脱字符号)匹配一行的开始,$(美元符号)匹配行的结束。.b匹配行开始处任何后跟b的两个字符,而ar$匹配任何以ar结束的行。正则表达式$匹配空行。更复杂的表达式到目前为止,我们已经学习了用于单个字符的重复。如果希望搜索一个或多个多字符字符串,比如 banan中an出现了两次,那么可以使用圆括号,在基本语法中必须转义。类似地,您可能希望搜索一些字符,但又不想使用 . 这么通用或者交替这么啰嗦的表达式。那么,您可以使用方括号()将交替情况括起来,常规语法需要转义。方括号中的表达式构成了一个字符类。使用方括号还可以减少转义特殊字符(比如 . 和 *)的需求,例外情况见后文。清单 5. 圆括号和字符类ianattic4:/lpi103-7$ grep (an)+ text1 # find at least 1 an3 bananaianattic4:/lpi103-7$ grep an(an)+ text1 # find at least 2 ans3 bananaianattic4:/lpi103-7$ grep 3p text1 # find p or 31 apple2 pear3 bananaianattic4:/lpi103-7$ echo -e find anns* herensomewhere. | grep s.*s* hereianattic4:/lpi103-7$ echo -e find ann * in position 2. | grep .* * in position 2.字符类还有几个有趣的可能性。范围表达式(Range expression)范围表达式是使用 -(连字符)分隔的双字符,比如数字里面的 0-9,十六进制里的 0-9a-fA-F。注意,范围与语言环境有关。署名类(Named class)有些署名类可以为通常使用的类提供便捷。署名类以 : 开始,以 : 结束,可以在括号表达式中使用。示例如下::alnum:字母数字字符:blank:空格和制表符:digit:数字 0 到 9(等效于 0-9):upper: 和 :lower:分别为大写字母和小写字母。(求反)在字符类 后的第一个字符使用时,(脱字符号)对剩余字符求反,因此只有类中不存在该字符时(前导除外)才能匹配。了解了以上特殊含义后我们知道,如果希望匹配一个字符类中的字面值 -(连字符),那么您必须将其放在第一个或最后一个。如果想匹配字面值(脱字字符),那么它不能是第一个字符。 在非第一个位置时表示结束类。字符类中,正则表达式和通配符是类似的,但使用的否定符号不同( 和 !)。清单 6 展示了一些字符类示例。清单 6. 更多字符类ianattic4:/lpi103-7$ # Match on range 3 through 7ianattic4:/lpi103-7$ echo -e 123n456n789n0 | grep 3-7123456789ianattic4:/lpi103-7$ # Find digit followed by no n or r till end of lineianattic4:/lpi103-7$ grep :digit:nr*$ text11 appleianattic4:/lpi103-7$ # Find a digit, n, or z followed by no n or r till end of lineianattic4:/lpi103-7$ grep :digit:nznr*$ text11 apple3 banana最后一个示例让您感到奇怪吗? 在这种情况下,第一个括号表达式匹配字符串中的任何数字、 n 或 z,至少 n 后面没有另一个 n 或 r,因此字符串结尾处的 na 匹配该正则表达式。哪些内容匹配?如果您能够区分高亮显示,比如用颜色、粗体或下划线,那么您可以设置 GREP_COLORS 环境变量来高亮显示匹配内容。默认设置使用粗体红色高亮显示匹配内容,如图 1 所示。您会看到整个输出的第一行都是匹配的,但是第二行只匹配最后两个字符。图 1. 使用颜色区分 grep 匹配内容如果您是正则表达式新手,或者不确定 grep 为什么返回某一行,那么这项技术可以帮您。回页首扩展的正则表达式扩展的正则表达式语法是 GNU 扩展。我们在基本语法中使用时,它不需要转义一些字符,包括圆括号、?、+、|和 。但缺点在于,如果您在正则表达式中将它们作为字符解释,那么必须进行转义。您可以使用-E(或者 grep 的-extended-regexp选项)表示您正在使用扩展的正则表达式语法。此外,egrep命令也可以帮助您实现这一点。清单 7 展示了本节上文中使用的示例,以及egrep使用的相应扩展表达式。清单 7. 扩展的正则表达式ianattic4:/lpi103-7$ # Find b followed by one or more ans and then an aianattic4:/lpi103-7$ grep b(an)+a text1 3 bananaianattic4:/lpi103-7$ egrep b(an)+a text13 banana回页首在文件中查找内容现在您了解了基本的命令,让我们使用grep和find在文件系统中查找内容。示例相对比较简单;它们使用学习 Linux,101:文本流和过滤器中创建的文件或者您在 lpi103-7 目录及其子目录中创建的文件。(参见 “设置示例”。)如果使用本系列之前的文章中创建的文件,您将有一些额外的文件,因此将看到一些额外的结果。首先,grep可以一次搜索多个文件。如果添加-n选项,它将告诉您匹配的行号。如果只想知道匹配多少行,可以使用-c选项,如果只想获得匹配的文件列表,可以使用-l选项。清单 8 展示了一些示例。清单 8. 搜索多个文件ianattic4:/lpi103-7$ grep plum *text2:9plumyaa:9plumianattic4:/lpi103-7$ grep -n banana text1-4text1:3:3 bananatext2:2:3bananaianattic4:/lpi103-7$ grep -c banana text1-4text1:1text2:1text3:0ianattic4:/lpi103-7$ grep -l pear *text1text1.bkpxaa查看清单 8 中的-c选项,您会看到一行text3:0。 您经常需要知道某个内容在文件中出现了多少次,但是不用知道没有出现该内容的文件。grep命令有一个-v选项,它表示只显示不匹配的行输出。因此,我们可以使用正则表达式:0$查找以逗号和 0 结尾的行。下一个示例是使用find查找当前目录及其子目录中的所有常规文件,然后使用xargs将文件列表传递到grep,以确定每个文件中出现banana的次数。最后,通过再一次调用grep筛选该输出,这一次使用-v选项查找所有不以 :0 结尾的行,只用告诉我们包含字符串banana的文件计数。清单 9. 查找至少包含一次 banana 的文件ianattic4:/lpi103-7$ find . -type f -print0| xargs -0 grep -c banana| grep -v :0$./backup/text1.bkp.2:1./text2:1./text1:1./yaa:1./xab:1./text1.bkp:1回页首正则表达式和 sed文章 “学习 Linux,101:文本流和过滤器” 中介绍了 sed流编辑器,其中提到 sed 使用正则表达式。regexps 可以在地址表达式和替代表达式中使用。如果您需要查找某内容,那么只需要使用grep。如果需要从匹配行中提取搜索字符串,或者相关字符串,那么需要进一步操作,您可以选择使用sed。让我们解释一下它的工作方式。首先回忆我们的两个示例文件,text1 和 text2,其中包含了一个数字,后跟空格,再加一个水果的名称,而 text3 包含重复的语句。我们在清单 10 中再看一次它的内容。清单 10. text1、text2 和 text3 的内容ianattic4:/lpi103-7$ cat text1-31 apple2 pear3 banana9plum3banana10appleThis is a sentence. This is a sentence. This is a sentence. 首先,我们将使用grep和sed提取以一个或多个数字开头,且后跟空白字符(空格或制表符)的行。一般情况下,sed在一个周期结束时打印出每个行,因此我们使用 sed 的-n选项禁止输出,然后使用sed中的p命令只打印匹配我们正则表达式的行。要确认我们对这两个工具使用的正则表达式相同,我们将其赋予一个变量。清单 11. 搜索 grep 和 sedianattic4:/lpi103-7$ grep $oursearch text1-3text1:1 appletext1:2 peartext1:3 bananatext2:9plumtext2:3bananatext2:10appleianattic4:/lpi103-7$ cat text1-3 | sed -ne /$oursearch/p1 apple2 pear3 banana9plum3banana10apple注意,grep在搜索到多个文件时将显示文件名称。因为我们使用cat提供sed的输出,所以sed无法知道源文件名。但是,匹配行是相同的,正如我们期望的那样。现在假设我们只需要找到的行中的第二个字。在本例中是水果的名称,但是我们需要查询 HTTP URL 或者文件名等等其他内容。例如,删除我们试图匹配的字符串就足够了,如清单 12 所示。清单 12. 使用 sed 删除前导数字ianattic4:/lpi103-7$ cat text1-3 | sed -n
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 窗帘售卖合同范本
- 房租打扫改造合同范本
- 2025年电气自动化控制基础综合应用考核试题及答案
- 2025年安全员知识考试题附含答案
- 预防医学考试题(含参考答案)
- 语言文字规范化知识测试题及答案
- 2025年紫外线测试题目及答案
- 2025年考中控证试题及答案
- 2025年病媒生物控制技术(097)副高试题及答案
- 2025新型医疗事故责任评估与赔偿解决方案合同
- 注射用甲苯磺酸瑞马唑仑-临床用药解读
- 班组长质量管理意识培训
- 四川省普通高中2024届高三上学期学业水平考试数学试题(解析版)
- 史丹利化肥的营销策划
- 气管切开套管脱出应急预案及处理流程
- 融媒体新闻报道实务 教学大纲
- 《橡胶制品工艺》考试复习题库(含答案)
- 《数据结构与算法》教案
- 《现代教育技术》课件-第一章 现代教育技术概述
- 14S501-2 双层井盖图集
- 人教版八年级下册数学期末试卷综合测试卷(word含答案)
评论
0/150
提交评论