首先谈一下grep.  grep linux界著名的文本处理三剑客之一。其被定位为文本搜索工具,是基于”pattern“对给定文本进行搜索操作的Grep的基本使用方法如下:

 

grep  [OPTIONS] PATTERN  [FILE...]

 

其中options指的是与grep命令相结合的一系列选项,如-v-i等等, pattern翻译过来就是模式,我们可以将其看做是一段文本的模板,在linux中我们常表示为正则表达式。指的是由文本字符及正则表达式元字符所编写的过滤条件,及我们需要利用grep进行过滤的目标文本,需要注意的是,我们最终使用grep过滤出来的内容具有最小匹配法则,即只要满足pattern中设定的最小集合即可,下面具体的例子将解释到。

 

  • grep与正则表达式

 

前面提到正则表达式, 正则表达式(英语:Regular Expression,在代码中常简写为regexregexpRE的流行解释为使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。我们对grep系列命令的学习离不开正则表达式,下面介绍一下常用的正则表达式的相关元字符。

一个字符串的描述是通过元字符来描述的, 这里所说的元字符是指不能被再度分割的最小字符集合,每个字符串都是由元字符构成的,而在描述一个字符串的时候会涉及到元字符的频率,空间(位置),和字符属性,因此下面将就这三面方面进行简单介绍。

 

字符属性, 指的是字符本身属于哪种类型, 比如字符型 ,数字型,字符大写, 字符小写, 空格字符等等。

首先看下我们用来做测试的文本的内容:

grep, egrep的用法_grep

1.字符属性匹配:

.:匹配任意单个字符;

grep, egrep的用法_grep_02

[ ]:匹配范围内的任意单个字符;

--要求只匹配到小写字母

grep, egrep的用法_egrep_03

--要求只匹配到数字

grep, egrep的用法_egrep_04

[^ ]:匹配范围外的任意单个字符;

这里只匹配到了两个特殊字符和一个数字

grep, egrep的用法_grep_05

[[:digit:]],表示匹配单个数字类型的字符

grep, egrep的用法_grep_06

[[:lower:]],匹配小写字母类型字符

grep, egrep的用法_egrep_07

[[:upper:]],匹配大写字母类型字符

grep, egrep的用法_egrep_08

[[:alpha:]],匹配字母类型字符,下面除了两个特殊字符和两个数字字符之外都符合条件

grep, egrep的用法_grep_09

[[:alnum:]],匹配数字和字母类型字符,下面只有两个特殊字符不符合条件

grep, egrep的用法_egrep_10

[[:space:]],匹配空字符,所有空格字符包括tab被匹配到了

grep, egrep的用法_egrep_11

[[:blank:]],匹配空字符,所有空格字符包括tab被匹配到了

grep, egrep的用法_egrep_12

[[:punct:]],匹配特殊符号,下面匹配到了三个特殊字符

grep, egrep的用法_grep_13

[[:graph:]]: 表示非空字符(非空格、控制字符),下面空行表示中间不为空字符出现0次的行,下面的红的行则表示连续非空字符的行

grep, egrep的用法_egrep_14






2.字符频率,即字符在一个字符串中出现的次数。表示字符频率元字符用在要指定其出现的次数的字符后面,用来限制其前面的字符要出现的次数。

 

字符频率匹配:

*:匹配前面的字符任意次(0,1或多次);

grep"x*y",如:

xxxyabcxy中间出现0次任意字符

xrt5/yxy中间出现多次任意字符

下面截图中,匹配*前面的“v 0

grep, egrep的用法_grep_15


.*:任意长度的任意字符;

grep"x.*y"

xy  ,0次任意字符

xb4y 2次任意字符

xb%5y ,三次任意字符

下面截图中,匹配两个h之间的所有字符

grep, egrep的用法_grep_16

\+:匹配前面的字符至少1次;

grep"x\+y"

xxxyabc   可以认为x出现了一次,两次,三次

abcxy     x出现了一次

下面截图中的X出现了3

grep, egrep的用法_egrep_17


\?:匹配前面的0次或1次,即前面的字符可有可无;

grep"x\?y"                                  

xxxyabc   这里x出现了一次                                          

abcxy     这里认为x出现了0   

下面的例子中,\?前面的字符出现了0

grep, egrep的用法_grep_18

\{m\}:其前面的字符出现m次,m为非负整数;      

grep"x\{2\}y"                               

xxxyabc   x出现了2

下面X出现了3.

grep, egrep的用法_egrep_19

\{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次的场景:

grep, egrep的用法_egrep_20

在搜索至少2s的时候就没有结果了

grep, egrep的用法_egrep_21

另一方面,\{m,\}:至少m次;                                          grep"x\{2,\}y"

xxy

xxxy

下面截图中X就出现了2次以上

grep, egrep的用法_grep_22

但是在将X换为s的时候就没有结果了

grep, egrep的用法_grep_23





3.空间位置的确定。

限制使用模式搜索文本,限制模式所匹配到的文本只能出现于目标文本的那个位置; 

                                                                           

^:行首锚定;用于模式的最左侧,^PATTERN ,下图中锚定行首是一个空字符,后面是任意多个任意字符

grep, egrep的用法_grep_24

$:行尾锚定;用于模式的最右侧,PATTERN$

下面例子中要找出所有以!为结尾的行,其中!为特殊字符,需要转义。

grep, egrep的用法_grep_25

^PATTERN$:要让PATTERN完全匹配一整行;

下面这个例子只匹配到行首是空行并且行末是!的那一行字符 

grep, egrep的用法_grep_26

^$:空行,下面截图中的例子搜索出一个空行

grep, egrep的用法_egrep_27

^[[:space:]]*$,下面截图中的例子搜出一个空行:

grep, egrep的用法_egrep_28


单词:由非特殊字符组成的连续字符(字符串)都称为单词;                     

\<\b:词首锚定,用于单词模式的左侧,格式为\<PATTERN, \bPATTERN

下面表示纯大写字母的单词:

grep, egrep的用法_grep_29

\>\b:词尾锚定,用于单词模式的右侧,格式为PATTERN\>, PATTERN\b

下面表示纯非大写字母组成的单词:

grep, egrep的用法_grep_30



4.特殊用法--分组与引用:                                            \(PATTERN\):将此PATTERN匹配到的字符当作一个不可分割的整体进行处理;

\n:模式中第n个左括号以及与之匹配的右括号之间的模式所匹配到的字符串;(不是模式,而是模式匹配的结果)

\1:第一组括号中的pattern匹配到的字符串;                                  \2:第二组括号中的pattern匹配到的字符串;                                  ……                                    

grep, egrep的用法_egrep_31



二、grep的常用选项
常用选项:                                        --color=auto:对匹配到的文本着色后高亮显示;         
 -i:忽略字符大小写;                                 
 -o:仅显示匹配 到的文本自身;                        
 -v, --invert-match:反向匹配;                       
 -E:支持扩展的正则表达式;                           
 -q, --quiet, --silient:静默模式,不输出任何信息;
   
1.grep  -v 忽略pattern中字母的大小写,下面的内容与原内容对比发现包含chaoshen的行全部被过滤了

grep, egrep的用法_grep_32

2.grep –o表示不显示匹配到的文本的整行而只显示文本本身

grep, egrep的用法_grep_33

3.grep –i表示搜索匹配字符时候忽略目标字符的大小写

grep, egrep的用法_egrep_34

4.grep –E 支持扩展的正则表达式相当于egrep,下面搜索出包含三个X的行

grep, egrep的用法_egrep_35

5.grep –c表示只输出匹配的行计数

grep, egrep的用法_grep_36

6.grep –n显示匹配的行以及行号

grep, egrep的用法_egrep_37

原文本的行号分布为:

grep, egrep的用法_egrep_38

7.grep –A除了显示匹配行之外还显示匹配行之后的内容

grep, egrep的用法_egrep_39



三、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, ...  

grep, egrep的用法_grep_40


需要搜索的目标字符之间具有或者的关系

a|ba或者b

grep, egrep的用法_grep_41