linux egrep用法,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系列命令的学习离不开正则表达式,下面介绍一下常用的正则表达式的相关元字符。

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

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

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

3403933e73b0f8e694bfc16b320d034e.png

1.字符属性匹配:

.:匹配任意单个字符;

5d4c0b86063b1c7e7b9b4d4b17a9ba48.png

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

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

7cbb7e65f92a5a0abd7eb39e6877ac4a.png

--要求只匹配到数字

f6f69398f8b71dde16dedb10a644db05.png

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

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

c1280522b49916c1ff8ac718ea243535.png

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

c9467cd9f4e32617004733f6451facbe.png

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

c8f675f30aa9a18d39913193728c05d8.png

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

b86d51f122dcc27bc1360e21d620ccd3.png

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

aee74b3cd1a438d6d3fcbb44c80983c8.png

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

7a1bc12006512d69daf736673fa0e55b.png

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

5434df1c5fb44c82bb74d3579c9c0b3a.png

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

fe87e7c26cab6eaa41fc3ddb89c554b8.png

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

2caa16c489d26488a900bf415710ac15.png

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

fbd96a3a6c96be1ab8fd75ed94551611.png

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

字符频率匹配:

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

grep"x*y",如:

xxxyabc,xy中间出现0次任意字符

xrt5/y,xy中间出现多次任意字符

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

19e2bf4642fea829229cd139a75aef08.png

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

grep"x.*y":

xy  ,0次任意字符

xb4y ,2次任意字符

xb%5y ,三次任意字符

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

1eae4183dcbb1b00c704beaeb97c094e.png

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

grep"x\+y":

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

abcxy     x出现了一次

下面截图中的X出现了3次

27669e25e2d06dbe1a502a9521b7d9b0.png

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

grep"x\?y":

xxxyabc   这里x出现了一次

abcxy     这里认为x出现了0次

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

1caf0b140841e2ab53d57c592a28d8c8.png

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

grep"x\{2\}y":

xxxyabc   x出现了2次

下面X出现了3次.

ff914dfcf1aaab62584b76a17ec6f249.png

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

6cc92b01d520731e2861e5c7191618c0.png

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

93f9732fada16d55e44da25b30965599.png

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

xxy

xxxy

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

70fb07d5f80babc929bd2567b7bf0318.png

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

16e7351647c678a87771b69576b49d12.png

3.空间位置的确定。

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

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

c0628812149138868a1f5663997acae6.png

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

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

9828ca22dabafb95321156bb21fa1868.png

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

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

8785d3a3227f9e2e183ffe015649f8ca.png

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

ea138f9eaad1be9881454302806cbbfa.png

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

011bf46bb2ca37e9aad76fc68a283936.png

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

\

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

272a2ed2efb21e95f345ae354518b84f.png

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

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

275d6453137513e70eafd74bb9600fcd.png

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

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

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

920623a845d2a764d3be2aef4bdd135c.png

二、grep的常用选项

常用选项:                                        --color=auto:对匹配到的文本着色后高亮显示;

-i:忽略字符大小写;

-o:仅显示匹配 到的文本自身;

-v, --invert-match:反向匹配;

-E:支持扩展的正则表达式;

-q, --quiet, --silient:静默模式,不输出任何信息;

1.grep  -v 忽略pattern中字母的大小写,下面的内容与原内容对比发现包含chaoshen的行全部被过滤了

a07d1d4ba78c388f5ce4a72478e52b7a.png

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

dd87710dec11dc6449cc11517090e87b.png

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

98725af68878b565771db61437341f03.png

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

16a12aca2d02b1518e99918dad05db1b.png

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

8d0919a8675cc882e582e8803c0dc7fb.png

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

cd7141e339fc33ed3fed9465378979be.png

原文本的行号分布为:

05eeed60b6548ce96c76ca729c051b5c.png

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

bfebabdd4cd5c0c128d99a9c1301b3b2.png

三、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:词尾

分组及引用:

(pattern):分组,括号中的模式匹配到的字符会被记录于正则表达式引擎内部的变量中

后向引用:\1, \2, ...

d1bb94aadaadb767b4e974e17ce0c8d6.png

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

a|b:a或者b

f3de0b4068a02d63430a477d530b66a3.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值