![find与grep命令简介及正则表达式_第1页](http://file1.renrendoc.com/fileroot_temp2/2020-10/1/13f427a0-02b9-4f9e-83c2-f3939633c9a4/13f427a0-02b9-4f9e-83c2-f3939633c9a41.gif)
![find与grep命令简介及正则表达式_第2页](http://file1.renrendoc.com/fileroot_temp2/2020-10/1/13f427a0-02b9-4f9e-83c2-f3939633c9a4/13f427a0-02b9-4f9e-83c2-f3939633c9a42.gif)
![find与grep命令简介及正则表达式_第3页](http://file1.renrendoc.com/fileroot_temp2/2020-10/1/13f427a0-02b9-4f9e-83c2-f3939633c9a4/13f427a0-02b9-4f9e-83c2-f3939633c9a43.gif)
![find与grep命令简介及正则表达式_第4页](http://file1.renrendoc.com/fileroot_temp2/2020-10/1/13f427a0-02b9-4f9e-83c2-f3939633c9a4/13f427a0-02b9-4f9e-83c2-f3939633c9a44.gif)
![find与grep命令简介及正则表达式_第5页](http://file1.renrendoc.com/fileroot_temp2/2020-10/1/13f427a0-02b9-4f9e-83c2-f3939633c9a4/13f427a0-02b9-4f9e-83c2-f3939633c9a45.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、find与grep命令简介及正则表达式写给大家看的Shell脚本编程入门教程索引两个更为有用的命令和正则表达式在我们开始学习新的Shell编程知识之前,我们先来看一下两个更为有用的两个命令,这两个命令虽然并不是Shell的一部分,但是在进行Shell编程时却会经常用到.随后我们会来看一下正则表达式.find命令我们先来看的是find命令.这个命令对于我们用来查找文件时是相当有用的,但是对于Linux新手来说却有一些难于使用,在一定程序是由于他所带的选项,测试,动作类型参数,而且一个参数的执行结果会影响接下来的参数.在我们深入这些选项和参数之前,我们先来看一个非常简单的例子.假如在我们的机子上有
2、一个文件wish.我们来进行这个操作时要以root身份来运行,这样就可以保证我们可以搜索整个机子:#find/-name wish-print/usr/bin/wish#正如我们可以想到的,他会打印出搜索到的结果.很简单,是不是?然而,他却需要一定的时间来运行,因为他也会同时搜索网络上的Window机器上的磁盘.Linux机器会挂载大块的Window机器的文件系统.他也会同时那些位置,虽然我们知道我们要查找的文件位于Linux机器上.这也正是第一个选项的用武之地.如果我们指定了-mount选项,我们就可以告诉find命令不要搜索挂载的目录.#find/-mount-name wish-prin
3、t/usr/bin/wish#这样我们仍然可以搜索这个文件,但是这一次并没有搜索挂载的文件系统.find命令的完整语法如下:findpathoptionstestsactionspath是一个很简单的部分:我们可以使用绝对路径,例如/bin,或者是使用相对路径,例如.如果我们需要我们还可以指定多个路径,例如find/var/home主要的一些选项如下:-depth在查看目录本身以前要先搜索目录中的内容-follow跟随符号链接-maxdepths N在搜索一个目录时至多搜索N层-mount(或-xdev)不要搜索其他的文件系统下面的是一些test的选项.我们可以为find命令指定大量的测试,并
4、且每一个测试会返回真或是假.当find命令工作时,他会考查顺序查找到的文件,并且会在这个文件上按顺序进行他们所定义的测试.如果一个测试返回假,find命令会停止他当前正在考查的文件并继续进行下面的动作.我们在下表中列出的只是一些我们最常用到的测试,我们可以通过查看手册页得到我们可以利用find命令使用的可能的扩展列表项.-atime NN天以前访问的文件-mtime NN天以前修改的文件-name pattern除了路径,与指定的类型匹配的文件名.为了保证指定的类型传递给find命令而并不是立即被Shell赋值,指定的类型必须用引号进行引用.-newer other文件相比要新的文件-type
5、 CC类型的文件,而这里的C可以指定的一种类型.最常用的是d代表目录,而f是指普通的文件.对于其他的文件类型,我们可以查看手册页.-user username指定的用户所拥有的文件我们也可以使用运算符进行测试的组合.大多数的有两种格式:短格式和长格式.!-not测试的反-a-and所有的测试必须为真-o-or测试中某一个为真我们可以使用括号来强行改变测试和运算符的次序.因为这些对于Shell来说有着特殊的意义,所以我们也需要使用反斜线将他们作为一个整体进行引用.另外,如果我们为文件名指定了匹配类型,我们也必须用引号进行引用,这样就可以避免他们被Shell进行扩展,从而可以将他们直接传递给fin
6、d命令.所以如果我们要写一个这样的测试,要查找比X文件要近或者是以一个范围开头的文件,我们要写成下面的形式:1.(-newer X-o-name_*)复制代码现在我们要试着在当前的目录下查找最近修改日期比while2更近的文件,我们可以用下面的命令:$find.-newer while2-print./elif3./words.txt./words2.txt./_trap$我们在上面所用的命令看起来似乎不错,但是我们却同时也搜索了当前的目录文件,而这并不是我们所希望的,我们所感兴趣只是常规文件.所以我们可以加上另外一个测试-type f:$find.-newer while2-type f-p
7、rint./elif3./words.txt./words2.txt./_trap$工作原理:这些命令是如何进行工作的呢?我们指定find命令应该在当前的目录下进行查找(.),而我们所要查找的是比while2更新的文件(-newer while2),而且如果已经传递了测试,还要测试这个文件是否为一个常规文件(-type-f).最后,我们使用我们以前用过的动作,-print,仅仅是来验证我们所找到的文件.下面我们要查找的文件或者是以下划线开头的或者是要比while2文件新的文件,但是也必须为一个常规文件.这个例子可以向我们展示如何来进行测试的组合:$find.(-name_*-or-newer
8、while2)-type f-print./elif3./words.txt./words2.txt./_break./_if./_set./_shift./_trap./_unset./_until$这时我们可以看到这并不是一件很难的事情,不是这样吗?我们必须转义圆括号,这样他就不会被Shell所保护,同时用引号引用*,这样他就可以直接传递给find命令了.既然我们现在能够可靠的查找文件,下面我们就来看一下当我们查找指定的文件时我们可以进行的一些协作.我们要再一次强调,我们在这里所列出的只是一些最常用的选项,我们可以查看手册页得到全部的集合.-exec command执行一个命令.这是我们最
9、常执行的动作.-ok command与-exec相类似,所不同的只是他会提示用户在执行将要执行的命令之前进行命令的确认.-print打印出文件名-ls使用ls命令列出当前的文件-exec和-ok命令会同一行的参数子序列作为他的参数的一部分,直到遇到一个终结符;序列.对于-exec和-ok来说字符串是珍上特殊的类型,而且会为当前文件的绝对路径所替换.这样的解释也许并不是太认人容易理解,但是一个例子也许可以很好的来说明这些.如下面的一个简单的例子:$find.-newer while2-type f-exec ls-l;-rwxr-xr-x 1rick rick 275 Feb 817:07./e
10、lif3-rwxr-xr-x 1rick rick 336 Feb 816:52./words.txt-rwxr-xr-x 1rick rick 1274 Feb 816:52./words2.txt-rwxr-xr-x 1rick rick 504 Feb 818:43./_trap$正如我们现在所看到的,find命令是相当有用的.要用好这个命令只需要一些简单的练习.然而这样的练习也许要付一定的代价,所以我们应做一些find命令的实验.grep命令我们将要看到的第二个非常有用的命令为grep命令,这是一个并不常见的名字,他是通用正则表达式解析器的简称(General Regular Expr
11、ession Parser).我们使用find命令在我们的系统是查找所需的文件,但是我们却要使用grep命令在文件中查找指定的字符串.而事实上,最常用的做法就是当我们在使用find命令时将grep作为一个命令传递给-exec.grep命令可以带选项,匹配的模式以及我们要在其中查找的文件:grepoptionsPATTERNFILES如果并没有指定文件名,他就会搜索标准输入.让我们从grep命令的主要的选项开始.我们在这里列出的只是一些主要的选项,我们可以从手册中得到更为详细的内容说明.-c打印出匹配行的总数,而不是打印出匹配的行-E打开扩展表达式-h禁止将在其中查找到匹配内容的文件名作为输出行
12、的前缀-i忽略大小写-l列出带用匹配行的文件名,而不是输出实际的匹配行-v将匹配类型转换为选择不匹配的行而不是匹配的行如下面的一些例子:$grep in words.txt When shall we three meet again.In thunder,lightning,or in rain?I come,Graymalkin!$grep-c in words.txt words2.txt words.txt:2 words2.txt:14$grep-c-v in words.txt words2.txt words.txt:9 words2.txt:16$工作原理:第一个例子中并没有指
13、定选项,grep命令只是简单在的words.txt文件中查找字符串in,并且打印出所匹配的行.在这里并没有打印出文件名,这是因为在这里我们只是使用了一个文件.在第二个例子中打印出在两个不同的中匹配行的总数,在这种情况就要打印出文件名.在最后的一个例子中我们使用了-v选项来转换查找的条件并且打印出在两个文件中不匹配的总行数.正则表达式正是我们所看到的,grep命令的基本用法是比较容易掌握的.现在我们要来看一下基本的正则表达式,这会允许我们做一些更为复杂的匹配.正如我们在前面所提到的,正则表达式是用在Linux或是共他的一些开源中的语言.我们可以在vi或是在编写Perl脚本时使用.在正则表达式的使
14、用过程中,一些字符会被以不同的方式进行处理.最常见的一些用法如下:在一行的开头$在一行的结尾.任意一个单一字符方括号中所包含是字母的范围,其中的任何一个都可以进行匹配,例如a-e的字母范围,或者是我们可以使用来进行反义.如果我们要将他们作为普通的字符来使用就要在这些字符前面加上.所以如果我们要查找一个$字符,我们就要使用$来进行查找.下面的是一些可以在方括号中使用的比较有用的特殊匹配:alnum:字母数字字符:alpha:字母:ascii:ASCII字符:blank:空格或是Tab:cntrl:ASCII码控制字符:digit:数字:graph:非控制,非空格字符:lower:小写字母:pri
15、nt:可打印字符:punct:标点字符:space:空白字符,包括垂直Tab:upper:大写字符:xdigit:十六进制数字另外,如果同时使用-E选项指定了扩展匹配,在正则表达式的后面也许会跟一些其他的控制匹配类型组合的字符.如果我们只是想将他们作为普通的字符进行使用,我们也要在其前面加上转义符.?可选的匹配,但是最多匹配一次*必须匹配0个或是多个项目+必须匹配1个或是多个项目n必须匹配n次n,必须匹配n次或是更多次n,m匹配范围为n次到m次,包括m次这些内容看起来有一些复杂,但是如果我们循序渐进,我们就会发现事实上这些内容并不如我们在第一眼看到时那样的复杂.最简单的掌握正则表达式的方法就是
16、简单的试一些例子:如果我们要查找以字符e结尾的行我们可以用下面的命令:$grep e$words2.txt Art thou not,fatal vision,sensible Isee thee yet,in form as palpable Nature seems dead,and wicked dreams abuse$正如我们所看到的,这个命令会搜索出以e结尾的匹配行.现在假设我们要查找以字母a结尾的单词.要达到这个目的,我们在方括号中使用特殊的匹配.在这样的情况下,我们要使用:blank:,这会测试一个空格或是一个Tab:$grep a:blank:words2.txt Is th
17、is adagger which Isee before me,A dagger of the mind,a false creation,Moves like aghost.Thou sure and firm-set earth,$现在假设我们要查找一个以Th开头的三个字母的单词.在这种情况下,我们需要同时使用:space:来决定一个单词的结尾并使用.来匹配另外的一个字母:$grep Th.:space:words2.txt The handle toward my hand?Come,let me clutch thee.The curtaind sleep;witchcraft cel
18、ebrates Thy very stones prate of my whereabout,$最后我们要使用扩展的grep命令来查找10个字符长的小写字母的单词.在这里我们要指定一个字符的范围的来匹配a到z,同时指定字符的10次重复:$grep-Ea-z10words2.txt Proceeding from the heat-oppressed brain?And such an instrument Iwas to use.The curtaind sleep;witchcraft celebrates Thy very stones prate of my whereabout,$我们
19、在这里只是接触正则表达式一些相对来说更为重要的一部分.正如在Linux中的其他的大多数的内容,在这之外会许多的文档来帮助我们要发现更为详细的内容,但是学习正则表达式的最好的方法就是要实验这些表达式.命令执行:当我们编写脚本时,我们常常需要在Shell脚本中取得命令执行结果的结果来使用.也就说我们需要执行一个命令并将这个命令的输出结果放在一个变量中.这时我们可以使用我们在前面的set命令的例子中所介绍的$(command)语法.这也是一个相对较老的格式,而最常使用的用法是command格式.所有新的脚本应使用$(.)的格式,这可以用来避免一些相当复杂的在反引号命令中使用$,所造成的转换规则.如果
20、在.结构中使用了反引号,我们就需要使用进行转义.这些相对模糊的字符会使得程序感到迷惑,有时甚至是一些经验丰富的程序也不得不进行一些试验以使得在反引号命令中的引号可以正确的进行工作.$(command)命令的结果只是简单的命令的输出.在这里我们要注意的是这并不是这个命令的返回状态,而是输出的字符串.如下面的例子:1.#!/bin/sh 2.echo The current directory is$PWD 3.echo The current users are$(who)4.exit 0复制代码因为当前的目录是一个Shell环境变量,所以第一行并不需要使用这种命令执行结构.然而,who命令的执
21、行结果,如果希望他在这个脚本中可见,我们就要使用这种命令结构.如果我们希望将他们的结果放在一个变量中,我们可以像平常一样将他们赋值给一个变量:1.whoisthere=$(who)2.echo$whoisthere复制代码将一个命令的执行结果放在一个脚本变量中的能力是相当强大的,因为这样就可以很容易的在脚本中使用现在的命令并取得他们的输出.如果你发现在你正在试着转换一个标准命令在标准输出上的输出结果的参数集合并将他们作为一个程序的参数,你就会发现命令xargs会帮助你完成这一切.可以查看手册页得到更深更详细的内容.有时会出现的一个问题就是我们要调用的命令会在我们所希望的文本出现之前输出了一些空
22、白符,或者是比我们所希望的更多的内容.在这样的情况下,我们可以使用我们在前面所说到的set命令.算术扩展我们已经使用了expr命令,这可以允许处理简单的算术命令,但是他的执行是相当的慢的,因为在处理expr命令时需要调用一个新的Shell.一个新的更好的替换就是$(.)扩展.通过将我们所希望的表达式包在括号里以便在$(.)中进行赋值,我们可以进行更为有效的简单算术.如下面的例子:1.#!/bin/sh 2.x=0 3.while$x-ne 10;do 4.echo$x 5.x=$($x+1)6.done 7.exit 0复制代码参数扩展我们在前面已经看到了参数分配与扩展的最简单形式,在那里我们
23、是这样写的:1.foo=fred 2.echo$foo复制代码当我们要在一个变量的结尾处加上另外的一个字符时却会发生问题.假设我们要写一个简短的脚本来处理名为1_tmp和2_tmp的文件,我们可以试着用下面的脚本来处理:1.#!/bin/sh 2.for iin 12 3.do 4.my_secret_process$i_tmp 5.done复制代码但是在每一个循环中,我们会得到下面的信息:my_secret_process:too few arguments发生了什么错误呢?问题就在于Shell会试着将变量$i_tmp用他的变量值进行替换,但是却并不存在这个变量.而Shell并不会认为这是一
24、个错误,而只是用空值来进行替换,所以并没有参数传递给my_secret_process.要将$i的扩展保护为变量的一部分,我们需要将i放在一对花括号中:1.#!/bin/sh 2.for iin 12 3.do 4.my_secret_process$i_tmp 5.done复制代码这样以后在第一个循环中,i的值会用$i进行替换,从而给出一个实际的文件名.这样我们就已经将一个参数的值替换为一个字符串了.我们可以在Shell中进行许多的替换.常常这样的方法会为参数的处理问题提供一个优雅的解决方法.常用到的一些如下表:$parm:-default如果一个参数为空,则将他设定为一个默认值.$#par
25、m给出参数的长度.$parm%word从末尾开始,移除与word相匹配的最小部分并返回其余的部分.$parm%word从末尾开始,移除与word相匹配的最长部分并返回其余的部分.$parm#word从开头开始,移除与word相匹配的最小部分并返回其余的部分.$parm#word从开头开始,移除与word相匹配的最长部分并返回其余的部分.这些替换对于我们要处理字符串来说是相当有用的.而最后的四个可以用来移除字符串中的部分内容,而这对于处理文件名和路径是更为有用的.如下面的一些例子中所示的:1.#!/bin/sh 2.unset foo 3.echo$foo:-bar4.foo=fud 5.echo$foo:-bar6.foo=/usr/bin/X11/startx 7.echo$foo#*/8.echo$foo#*/9.bar=/usr/local/etc/local/networks 10.echo$bar%local*11.echo$bar%local*12
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年福州货运资格证模拟考试题库
- 2024-2025学年九年级科学上册第4章代谢与平衡第1节食物与营养作业设计新版浙教版
- 2024-2025学年七年级数学上册第二章有理数及其运算2.12用计算器进行运算教案新版北师大版
- 《桥梁监测方案》
- 个人简历表格模板14篇
- 教师个人年度工作成效总结
- 秋季学期六年级语文组工作总结
- 湘教版地理八年级上册《第一节 中国的地形》听课评课记录3
- 青年干部培训计划
- 部编人教版道德与法治九年级上册3.2《参与民主生活》听课评课记录
- 2024年山东省普通高中学业水平等级考试生物真题试卷(含答案)
- 2024年青海省西宁市选调生考试(公共基础知识)综合能力题库汇编
- 2024年4月自考00608日本国概况试题
- 广州绿色金融发展现状及对策的研究
- 保卫管理员三级培训
- 2024年十八项医疗核心制度考试试题及答案
- 《近现代史》义和团运动
- 七年级数学(上)有理数混合运算100题(含答案)
- 辅导员素质能力大赛基础知识试题题库
- 《初三毕业班开学第一课:收心及中考冲刺》班会课件
- 2024年山东司法警官职业学院高职单招(英语/数学/语文)笔试历年参考题库含答案解析
评论
0/150
提交评论