find和grep的前世和今生
作者:互联网
上一篇中具体的说了说find命令的一些简单的用法,从头到尾看起来都很简单,有人就说啦:“啊,大名鼎鼎的find命令也不过如此嘛!”那么今天的他来了——通配符与正则表达式。
find与grep的前世今生
grep命令
这里先简单介绍一下grep命令,通俗的来说明grep的作用就是,查找【文件中】包含字符串xxx
的行。
grep命令的基本语法
grep [options] [keywords] [file PATH]
grep命令的基本应用
-
实例:搜索
/home/klelee/abc
文件中含有hello的行
注:grep命令是一个很强大命令,这里只是简单的介绍,后面会写专门的章节研究grep命令的。
find命令-通配符查找
先来看一个特殊案例,在/home/klelee/find_grep/
目录下新建连个文件,abc
, abcd
文件,使用find命令检索abc字段,看看会搜到什么,let's go!
可以看到,我们以abc字段进行检索的情况下,find命令只能检索到abc文件,不能检索到其他的文件,哪怕是同样以abc开头的abcd文件。
但是find如此强大,会被这么一个小难题困住吗?当然不会。因此,find可以使用通配符进行查找,下面列出几种find使用的通配符。
通配符 | 描述 |
---|---|
* | 匹配0个或多个【任意】内容 |
? | 匹配一个【任意】字符 |
[ ] | 匹配括号中的任意【一个】字符 |
[a-z] | 匹配括号中指定区域的字符,如:[A-Z],[0-9]等 |
[^] | 表示排除括号中的字符 |
基本语法
find [PATH] -name <字段和通配符>
应用实例
那么接下来我们继续去检索abc字段,不过这次我们适当的使用通配符
-
案例一:使用通配符“*”号,匹配以abc开头的文件
啊,在这里遇到错误啦,查百度说,查找多个文件时,需要给匹配字段加双引号哦。这里索引到两个文件。要注意的是匹配到了abc这个文件,这个时候的匹配符“*”其实相当于0个任意字符。
-
案例二:使用通配符“?”以及“[ abcde ]”号,匹配以abc开头的文件
咦,只检索到abcd文件,却没有搜索到abc文件。这是因为?号和[]都至少要匹配一个字符哦。
-
案例三:使用find命令搜索根目录下以cd结尾的普通文件
以上就是find命令搭配通配符进行检索的一些知识,这些应用是很灵活的。从几个实例可以看出来,find通配符是一种匹配式检索,必须符合你输入的字段的格式,比如“*cd”,就是必须以cd结尾的文件或目录。接下来,我们对比学习grep使用正则表达式。
grep命令-正则表达式查找
为了对比find,grep也做一个小小的实验,观察观察!在/home/klelee/find_grep/abc
文件中检索abc字段,看看都能检索到一些什么?
可以看到,检索到的abc的位置,什么样的都有,有行首的,有行尾的,甚至行中的都检索到了。所以概括而言,grep的检索,就是这句话里只要有检索的字段,就将这句话输出。这就是包含查找。
但是,对于这种包含查找,也有特殊的需求,比如我想搜“abcd【好几个d】”????怎么搜,或者“a【b我也不知道有没有b】c”???是不是有很多问号,这就是模糊查询,这时候就用到了grep命令的“通配符了”。
正则表达式的“通配符”
符号 | 描述 |
---|---|
? | 前一项是可选的,最多匹配一次 |
* | 匹配前一个字符0ci或多次 |
[ ] | 匹配括号中的任意字符 |
[a-z] | 匹配a-z中间的任意字符 |
[^] | 匹配不包含字段的行 |
^ | 匹配开头样式 |
& | 匹配结尾样式 |
基本语法
grep "要匹配的字段" [文件]
应用实例
-
实例一:在abc文件中寻找abc或者abcd
分析:什么意思呢?就是这个d可有可无呗?那根据上面的正则表达式可以看出需要使用“?”号
咦?怎么会没有呢?这是因为,在shell的正则表达式中是没有?这个匹配选项的,这种情况下,我们应该使用egrep
-
实例二:在abc文件中寻找abc好几个d的行
最难理解的就是“?”和“*”,其他的都很简单。
对比find和grep
- find用来搜索文件,而grep用来搜索内容。
- find搜索讲究的是,要按我想的来的一摸一样,grep讲究的是差不多就行,abc管他好几个d,有d就行。但是find不可以,abc是abc吗,abcd就得加通配符了。
结语
find到此为止了,可是grep却刚刚开始!
标签:检索,今生,匹配,通配符,abc,grep,find 来源: https://www.cnblogs.com/klelee/p/15759040.html