加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

grep及基本正则表达式

发布时间:2020-12-14 01:59:27 所属栏目:百科 来源:网络整理
导读:grep (Global search Regular Exmpression and Printing) 命令是Linux中最常用的命令之一,用于搜索给定文本文件中匹配某个特定模式(pattern)的行。其中模式为文本字符及正则表达式的元字符组合而成。 首先来介绍一下grep的基本用法,通过man grep 可以看到g


grep (Global search Regular Exmpression and Printing) 命令是Linux中最常用的命令之一,用于搜索给定文本文件中匹配某个特定模式(pattern)的行。其中模式为文本字符及正则表达式的元字符组合而成。


首先来介绍一下grep的基本用法,通过man grep 可以看到grep的帮助信息:

144357689.jpg

那么grep,egrep,fgrep有何区别呢?

grep: 默认支持基本正则表达式;

egrep:支持 扩展正则表达式;

fgrep: 不支持正则表达式元字符,但搜索字符串的速度更快;


1. grep的常用选项(OPTIONS)

--color=auto:高亮显示匹配到的字符串;

144415660.jpg

-v: 反向选取,只显示不符合模式的行;

-o: 只显示被模式匹配到的字串,而不是整个行;

-i: 不区分字符大小写;

-A #:显示匹配到的行时,顺带显示其后面的#个行;

-B #:前面的#行;

-C #:前后的#行;

-E: 使用扩展的正则表达式, grep -E = egrep


grep命令的模式十分灵活,可以是字符串,也可以是变量,还可以是正则表达式。需要注意的是,无论模式是何种形式,只要模式中包含空格,就需要使用双引号将模式引起来,如果不加双引号,空格后的单词容易被误认为是文件名。大部分情况下,使用单引号将模式引起来也是可以的。


2. 基本正则表达式

2.1 基本元字符

元字符:不表示字符本身的意义,而用于额外功能性的描述

. :点号,匹配任意单个字符。

[ ]:匹配指定范围内的任意单个字符: [a-z],[A-Z],[0-9]

[^ ]:匹配指定范围外的任意单个字符:如grep "[^0-9]" file,表示除了数字,都匹配


2.2 次数匹配

注意:grep默认工作在贪婪模式下,即尽可能长地去匹配符合模式的内容。

示例,如有文本text 包含以下内容:

145828759.jpg

"a.b"表示匹配a和b中间有一个任意字符的内容

145828177.jpg


*:星号,匹配紧挨在其前面的字符任意次(包括0次)。

"a*b"表示匹配b前的a任意次

145828339.jpg


.*:点星组合,匹配任意长度的任意字符(包括0次)。

"a.*b" 表示匹配ab之间的任意字符任意次。

145828607.jpg


?: 匹配其前面的字符1次或0次 (""为转义字符)

"a?b" 表示匹配b前的a 1次或0次

150622283.jpg

{m,n} :匹配其前面的字符至少m次,至多n次

{0,n}: 至多n次;0-n次;

{m,}:至少m次

{m}: 精确匹配m次;

例如:{2,} 表示匹配至少2次

151432315.jpg


2.3 字符集合

[:digit:] 所有数字 0-9
[:lower:] 所有小写字母 a-z
[:upper:] 所有大写字母 A-Z
[:punct:] 所有标点符号
[:space:] 表示空格或tab键
[:alpha:] 表示所有字母(包含大小写)a-zA-Z
[:alnum:] 表示所有字母和数字 a-zA-Z0-9

注意,需要额外的[ ]把表达式括起来

例如: [[:digit:]],表示匹配0到9中任意一个数字,相当于[0-9],如果取反就是[^[:digit:]],即[^0-9].


2.4 位置锚定

^: 锚定行首的符合条件的内容,用法格式“^pattern”;

如查找/etc/passwd文件中以root开头的行:

153241932.jpg

$: 锚定行尾的符合条件的内容,用法格式“pattern$”;

如查找/etc/passwd中以bash结尾的行:

153241308.jpg

^$: 结合使用表示查找空白行
&;: 锚定词首,用法格式:&;pattern
&;: 锚定词尾,用法格式:pattern&;
&;pattern&;:可用于查找某个独立的单词

如查找/etc/passwd文件中以r开头,t结尾,中间包含两个任意字符的单词

153823774.jpg

注意:与grep "r..t" /etc/passwd结果的区别:

153823243.jpg



2.5 分组符号

()
(ab):表示ab整体作为匹配字符
(ab)* ::表示ab整体作为匹配字符,且匹配任意次
(ab){1,}:表示ab整体作为匹配字符,且匹配至少一次
分组还可以后向引用:
1: 引用第一个左括号以及与之对应的右括号所包括的所有内容
2: 引用第二个左括号以及与之对应的右括号所包括的所有内容
3: 引用第三个左括号以及与之对应的右括号所包括的所有内容

如有text文本内容如下:

155151339.jpg

要匹配l..e.*l..er 的模式可以使用后向引用1

grep "(l..e).*1r" text 表示匹配结果如下:

155151504.jpg

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读