在此之前介绍过通配符,我们可以通过使用通配符来匹配文件来达到搜索想要查找文件的目的,那如果要查找文件的内容又该如何搜索及匹配查找呢?
那么我们可以使用grep命令来完成对文件内容的匹配并将它显示出来,那么接下来主要介绍一下grep命令的使用。
grep的作用:根据模式搜索文本,并将符合模式的行显示出来。
语法格式 grep [option] PATTERN FILE..
-i:匹配时忽略大小写
--color:把匹配的字符串用颜色高亮显示出来
-o:只显示被模式匹配的字符串
-n:显示匹配行的行号
-E:支持扩展的正则表达式(后面的元字符那必须是扩展正则表达式的元字符)
grep -E=egrep
-A n:after 当某行被模式匹配成功时,显示该行以及该行后面的n行
-B n:before 某行被模式匹配成功时,显示该行以及该行前面的n行
-C n:-A和-B的结合体,显示前后n行
那么什么是模式呢?
模式:就是由文本字符和正则表达式的元字符组合而成的匹配条件
正则表达式的元字符,可以分为这几类:
1、字符匹配
.:表示任意单个字符
[]:指定范围内的任意单个字符
[^]:指定范围外的任意单个字符
2、匹配次数(linux的哲学思想就是贪婪匹配,通俗的说就是尽可能的去匹配)
*:匹配其前面的字符任意次,包括0次
.*:表示任意长度的任意字符
\?(转义):匹配其前面的字符0次或1次
\{m,n\}(转义):匹配其前面的字符至少m次,至多n次
3、位置锚定
^:锚定行首,该符号后面的任意字符必须在行首(如果某行前面有空格,这样的行将不会匹配)
$:行尾锚定,该符号前面的任意字符必须在行尾
^$:表示空白行
4、单词锚定
\<或\b:锚定词首,其后面的任意字符必须作为单词的词首出现(说明:特殊字符不是单词的组成部分)
\>或\b:锚定词尾,其前面的任意字符必须作为单词的词尾出现
5、分组
\(\):把字符串当做一个组,再来匹配
例如 \(ab\)*:表示将ab当做一个整体进行匹配,匹配这个整体的任意次数
分组的另一个语法:向后引用
向后引用:就是引用前面括号里面的内容,并且前面括号里面的内容和后面的引用的内容一样。
\1,\2,\3...:表示引用第一个左括号以及与之对应的右括号里面的内容,且保持一致
我们知道正则表达式分为基本正则表达式和扩展正则表达式
基本正则表达式在上面已经介绍了,扩展正则表达式只是在基本正则表达式上进行了部分修改和增加了部分命令。那么我们先来看看正则表达式的元字符。同样也可以分为以下几类:
1、字符匹配(这个和基本正则表达式一样)
.:匹配任意单个字符
.*:匹配任意长度的任意字符
[]:匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符
2、次数匹配
*:匹配其前面的字符任意次
?:在扩展正则表达式里面不加\来转义,表示匹配其前的字符0次和1次
{m,n}:在扩展正则表达式里面不加\来转义,匹配其前的字符至少m次,至多n次
+:表示匹配其前字符至少一次,相当于{1,}
3、位置锚定(和基本正则表达式相同)
^:行首锚定,该字符后面的任意字符必须出现在行首
$:行尾锚定,该字符前面的任意字符必须出现在行尾
4、单词锚定
\<或\b:词首锚定,其后面的字符必须出现在词首
\>或\b:词尾锚定,其前面的字符必须出现在词尾
5、分组
():在扩展正则表达式里面不加\来转义,将括号里面的字符串当做一个整体来显示
\1,\3...:引用第一(二,三...)个左括号以及与之对应的右括号里面的内容,且两者一致
6、或者
|:表示或者的关系,只选其一
例如 ab|cd:表示ab或者cd
示例一:使用正则表达式来匹配所有的ip地址。
我们知道ip地址是由4个单词和3个'.'组成的,每一个单词最少由一位数字组成,最多由三位数字组成。
最大的ip为255.255.255.255
对于ip地址分析如下:
1、当单词由一位数字组成时,正则表达式为[0-9]
2、当单词由两位数字组成时,正则表达式为[1-9][0-9]
3、当单词由三位数字组成时,由于要么是1开头的,要么是2开头的,因此又可以分为如下情况:
当第一位数字为1时,正则表达式为1[0-9][0-9]
当第一位数字为2时,由于2开头的最大为255,因此又可以将第二位数分成非5和为5的情况
当第二个数字非5时,正则表达式为2[0-4][0-9]
当第二个数字是5时,正则表达式为25[0-5]
因此,匹配所有的ip地址,其中包括0.0.0.0 255.255.255.255
则使用的命令为:
grep -E '(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.){3}\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>' FILE
示例二、使用正则表达式匹配A、B、C类地址
egrep --color '\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[01][0-9]|22[0-3])\>\.(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.){2}\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>' FILE