grep,egrep的用法
首先谈一下grep. grep是 linux界著名的文本处理三剑客之一。其被定位为文本搜索工具,是基于”pattern“对给定文本进行搜索操作的Grep的基本使用方法如下:
grep [OPTIONS] PATTERN [FILE...]
其中options指的是与grep命令相结合的一系列选项,如-v,-i等等, pattern翻译过来就是模式,我们可以将其看做是一段文本的模板,在linux中我们常表示为正则表达式。指的是由文本字符及正则表达式元字符所编写的过滤条件,及我们需要利用grep进行过滤的目标文本,需要注意的是,我们最终使用grep过滤出来的内容具有最小匹配法则,即只要满足pattern中设定的最小集合即可,下面具体的例子将解释到。
grep与正则表达式
前面提到正则表达式, 正则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE)的流行解释为:使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。我们对grep系列命令的学习离不开正则表达式,下面介绍一下常用的正则表达式的相关元字符。
一个字符串的描述是通过元字符来描述的, 这里所说的元字符是指不能被再度分割的最小字符集合,每个字符串都是由元字符构成的,而在描述一个字符串的时候会涉及到元字符的频率,空间(位置),和字符属性,因此下面将就这三面方面进行简单介绍。
字符属性, 指的是字符本身属于哪种类型, 比如字符型 ,数字型,字符大写, 字符小写, 空格字符等等。
首先看下我们用来做测试的文本的内容:
1.字符属性匹配:
.:匹配任意单个字符;
[ ]:匹配范围内的任意单个字符;
--要求只匹配到小写字母
--要求只匹配到数字
[^ ]:匹配范围外的任意单个字符;
这里只匹配到了两个特殊字符和一个数字
[[:digit:]],表示匹配单个数字类型的字符
[[:lower:]],匹配小写字母类型字符
[[:upper:]],匹配大写字母类型字符
[[:alpha:]],匹配字母类型字符,下面除了两个特殊字符和两个数字字符之外都符合条件
[[:alnum:]],匹配数字和字母类型字符,下面只有两个特殊字符不符合条件
[[:space:]],匹配空字符,所有空格字符包括tab被匹配到了
[[:blank:]],匹配空字符,所有空格字符包括tab被匹配到了
[[:punct:]],匹配特殊符号,下面匹配到了三个特殊字符
[[:graph:]]: 表示非空字符(非空格、控制字符),下面空行表示中间不为空字符出现0次的行,下面的红的行则表示连续非空字符的行
2.字符频率,即字符在一个字符串中出现的次数。表示字符频率元字符用在要指定其出现的次数的字符后面,用来限制其前面的字符要出现的次数。
字符频率匹配:
*:匹配前面的字符任意次(0,1或多次);
grep"x*y",如:
xxxyabc,xy中间出现0次任意字符
xrt5/y,xy中间出现多次任意字符
下面截图中,匹配*前面的“v ”0次
.*:任意长度的任意字符;
grep"x.*y":
xy ,0次任意字符
xb4y ,2次任意字符
xb%5y ,三次任意字符
下面截图中,匹配两个h之间的所有字符
\+:匹配前面的字符至少1次;
grep"x\+y":
xxxyabc 可以认为x出现了一次,两次,三次
abcxy x出现了一次
下面截图中的X出现了3次
\?:匹配前面的0次或1次,即前面的字符可有可无;
grep"x\?y":
xxxyabc 这里x出现了一次
abcxy 这里认为x出现了0次
下面的例子中,\?前面的字符出现了0次
\{m\}:其前面的字符出现m次,m为非负整数;
grep"x\{2\}y":
xxxyabc x出现了2次
下面X出现了3次.
\{m,n\}:其前面的字符出现至少m次,至多n次,m为非负整数;[m,n]
其中,\{0,n\}: 至多n次;
grep"x\{0,2\}y"
by x出现了0次
xy x出现了1次
xxy x出现了2次
下面截图场景中对应的都是至少出现1次的场景:
在搜索至少2个s的时候就没有结果了
另一方面,\{m,\}:至少m次;
grep"x\{2,\}y"
xxy
xxxy
下面截图中X就出现了2次以上
但是在将X换为s的时候就没有结果了
3.空间位置的确定。
限制使用模式搜索文本,限制模式所匹配到的文本只能出现于目标文本的那个位置;
^:行首锚定;用于模式的最左侧,^PATTERN ,下图中锚定行首是一个空字符,后面是任意多个任意字符
$:行尾锚定;用于模式的最右侧,PATTERN$
下面例子中要找出所有以!为结尾的行,其中!为特殊字符,需要转义。
^PATTERN$:要让PATTERN完全匹配一整行;
下面这个例子只匹配到行首是空行并且行末是!的那一行字符
^$:空行,下面截图中的例子搜索出一个空行
^[[:space:]]*$,下面截图中的例子搜出一个空行:
单词:由非特殊字符组成的连续字符(字符串)都称为单词;
\<或\b:词首锚定,用于单词模式的左侧,格式为\<PATTERN, \bPATTERN
下面表示纯大写字母的单词:
\>或\b:词尾锚定,用于单词模式的右侧,格式为PATTERN\>, PATTERN\b
下面表示纯非大写字母组成的单词:
\<PATTERN\>:单词锚定;
4.特殊用法--分组与引用: \(PATTERN\):将此PATTERN匹配到的字符当作一个不可分割的整体进行处理;
\n:模式中第n个左括号以及与之匹配的右括号之间的模式所匹配到的字符串;(不是模式,而是模式匹配的结果)
\1:第一组括号中的pattern匹配到的字符串;
\2:第二组括号中的pattern匹配到的字符串;
……
grep的常用选项
常用选项:
--color=auto:对匹配到的文本着色后高亮显示;
-i:忽略字符大小写;
-o:仅显示匹配 到的文本自身;
-v, --invert-match:反向匹配;
-E:支持扩展的正则表达式;
-q, --quiet, --silient:静默模式,不输出任何信息;
1.grep -v 忽略pattern中字母的大小写,下面的内容与原内容对比发现包含chaoshen的行全部被过滤了
2.grep –o表示不显示匹配到的文本的整行而只显示文本本身
3.grep –i表示搜索匹配字符时候忽略目标字符的大小写
4.grep –E 支持扩展的正则表达式相当于egrep,下面搜索出包含三个X的行
5.grep –c表示只输出匹配的行计数
6.grep –n显示匹配的行以及行号
原文本的行号分布为:
7.grep –A除了显示匹配行之外还显示匹配行之后的内容
三、egrep:支持使用扩展正则表达式的grep命令,相当于grep-E;
该命令的使用方法:
egrep[OPTIONS] PATTERN [FILE...] 扩展正则表达式的元字符:
1.字符匹配(与grep中的用法一样, 不再举例):
.:任意单个字符
[ ]:范围内的任意单个字符
[^ ]:范围外的任意单个字符
2.频率匹配:
*:任意次(与grep中的用法相同)
?:0次或1次(相当于grep中的\?);
+:1次或多次(相当于grep中的\+);
{m}:匹配m次(相当于grep中的\{m\});
{m, n}:至少m次,至多n次(相当于grep中的\{m,n\});
{0,n}:匹配至多n次至少0次(相当于grep中的\{0,n\});
{m,} 匹配至少m次(相当于grep中的\{m,\});
位置锚定(与grep用法一致):
^:行首
$:行尾
\<,\b:词首
\>,\b:词尾
分组及引用:
(pattern):分组,括号中的模式匹配到的字符会被记录于正则表达式引擎内部的变量中
后向引用:\1, \2, ...
或者:
a|b:a或者b
C|cat:表示C或cat
(C|c)at:表示Cat或cat