开发者社区> 余二五> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

文本检索秘技之正则表达式grep和egrep

简介:
+关注继续查看

一、总纲(何为正则)

   所谓正则,又称正则表达式、正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regexregexpRE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。(维基百科如是说)

   为了便于理解,可以将正则想象成为普通语言,普通字符对应的是普通文字,而元字符则对应语法,根据语言的规则,按照语法将文字组合起来,就会表述出你想说的话即想要的文本。

第一式  grep是什么

   grepglobal search regular expressionRE)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。UNIXgrep家族包括grepegrepfgrepegrepfgrep的命令只跟grep有很小不同。egrepgrep的扩展,支持更多的re元字符,fgrep就是fixed grepfast grep,它们把所有的字母都看做单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能更强,可以通过-G-E-F命令行选项来使用egrepfgrep的功能。

格式:

grep [OPTIONS] PATTERN [FILE...]

grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

第一招:常用选项[OPTIONS]

-v: 反向,显示不能被模式所匹配到的行;

1
2
#检索文件/etc/passwd中非#的行
grep -v "#" /etc/passwd

wKiom1MIIkGTIUJHAAGLj-ufAO8039.jpg

-o: 仅显示被模式匹配到的字串,而非整行;

1
2
#检索/etc/passwd文件中有没有rpcuser用户
grep -o "rpcuser" /etc/passwd

wKiom1MGA8_iKopEAACiNHPoVgs406.jpg

-i: 不区分字符大小写, ignore-case

1
2
#检索/etc/fstab中包含u中间跟两个任意字符,最后一个字符为d的行,不区分大小写
grep --color -i "u..d" /etc/fstab

wKioL1MII1CCKT1BAAB2w1DiXAM680.jpg

-E: 支持扩展的正则表达式(加-E可以使用grep启用egrep的功能 grep -E)

-A #:之后的几行字符

wKiom1MIJD6hNdY8AAEysYx-m6E566.jpg

-B:之前的几行字符

wKiom1MGGYHDxuyPAAD4-1RZy8w076.jpg

-C #:上下两行

wKioL1MGGciRUgr2AAF6Ms16krQ900.jpg

-n: 显示匹配行及行号,在显示出内容的每行前面会显示行数wKioL1MGGmnBoRT_AACPrr6wlFc404.jpg

第二招:模式(PATTERN)

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

字符匹配:

.: 任意单个字符

1
2
#在/etc/passwd文件中检索包含r后面跟两个字符,然后是t的行
grep --color "r..t" /etc/passwd

wKioL1MGHRDjyICxAACwNcdVav0597.jpg

[ ]: 指定范围内的任意单个字符

1
2
#在/etc/inittab下检索以S或s后面接任意一个字符,之后是s的行
grep --color "[sS].s" /etc/fstab

wKioL1MGIO6wqOYsAACjk_-m_GU270.jpg[[:digit:]] 匹配任何一个数字([0-9]

1
grep --color "jin[[:digit:]]" /etc/passwd

wKioL1MIJ9KTydTTAAGa6Ta3qlU023.jpg

[[:alnum:]] 匹配任何一个字母或数字([A-Za-z0-9])

[[:alpha:]] 匹配任何一个字母([A-Za-z])

[[:lower:]] 匹配任何一个小写字母([a-z])

[[:upper:]] 匹配任何一个大写字母([A-Z])

[[:space:]] 任何一个空白字符:制表符、空格

[[:punct:]] 任何一个标点符号(不包括:[:alnum:]、[:cntrl:]、[:space:]字符集)

[^]:指定范围外的任意单个字符

1
2
#在/etc/selinux/config下检索非标点符号开始的行
grep --color "^[^[:punct:]].*" /etc/selinux/config

wKiom1MGJznwh8wNAAB5pARnz1w901.jpg

位置锚定:用于指定字符出现的位置

^: 锚定行首

wKiom1MIRB6Qon9bAAB1MrjnWuE728.jpg

$: 锚定行尾

1
2
bash结尾的行
grep --color "bash$" /etc/passwd

wKiom1MGKVuitRs3AAGyWw0D4zo774.jpg

^$: 空白行

1
2
#统计/etc/init/tty.conf文件中的空行数
grep "^$" /etc/init/tty.conf  |wc -l

wKioL1MGKi2wli5wAAEmJ5b4Lq8079.jpg

\<char: 锚定词首,也可以写成\bchar(注:\b是元字符)

1
2
#检索/etc/passwd 文件中以r为词首,后面跟两个任意字符,最后一个字符是t的行
grep --color "\br..t" /etc/passwd

wKiom1MGKh2wHelkAACGznXgc6I010.jpg

char\>: 锚定词尾,char\b(注:\b也可以用于锚定词尾)

1
2
#以s结尾前面以三个任意字符开头的系统用户
grep --color "^...s\b" /etc/passwd

wKioL1MIRjPgz-TWAABy8xAhOQY764.jpg

次数匹配:用来指定匹配其前面的字符的次数

*: 任意次(0次或多次)

1
2
#a*b重复a为零次或多次(贪婪模式:尽可能的长的去匹配字符;)
grep --color ab*bd test.txt

wKiom1MHfR-A1c7gAABkxGW9RlU963.jpg

.*: 匹配任意长度的任意字符

1
2
#\?: 0次或1次(a\?b 则表示a的匹配一次或一次都没有)
grep --color "a\?b" test.txt

wKiom1MHYnjDUxxOAACBPqPITi8355.jpg

ab*xy:则表示只能匹配*号之前b任意次b(0或多次)

\{m\}: 匹配m次

wKioL1MHYvDD8fUEAAFM_gQVUrg302.jpg

\{m,n\}:最少匹配m次,最多匹配n次

wKioL1MIR-uCBDstAACSatj0rEE334.jpg

\{m,\}: 至少m次;

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

分组:

\(\)

1
2
#检索文件中包含w字符之以es为组后面接t然后任意字符,组es重复一次的行
grep --color "w\(es\).*\1" test.txt

wKioL1MHYQbwnjWyAACcBcIrk-E509.jpg

es)被作为一个组看待,它是一个组,它的名称是1,然后 .*表示之后的任意个字符,[\1]指代的是前面用括号括起来的es。那么  egrep 里的 w(es)t.*\1 就是说 west后面任意字符,再然后再出现es的,这种行被匹配到

引用:

\1: 后向引用,引用前面的第一个左括号以及与之对应的右括号中的模式所匹配到的内容。(后向引用可以有多次,方法\#(#:数字))

第二式:egrep(grep -E)

 grep 的扩充版本改良了许多传统 grep 不能或不便的操作比方说:

- grep 之下不支持 ?  + 这两种 modifier,  egrep 则可.      

注:

?: 匹配其前面的字符0或1次;

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

|:表示或关系,比如 'gd|good|dog' 表示有gd,good或dog的串

():将部分内容合成一个单元组。比如要搜索 glad 或 good 可以这样 'g(la|oo)d',()的好处是可以对小组使用 + ? * 等。

比如要搜索A和C开头结尾,中间有至少一个(xyz) 的串,可以这样 : 'A(xyz)+C'

- grep 不支持 a|b  (abc|xyz) 这类"或一"比对 egrep 则可.  

1
2
3
4
#输出包含1或2的行
grep --color '\(1\|2\)' /etc/inittab
#或
grep --color -E '(1|2)' /etc/inittab

wKioL1MHciaT6O0iAAEp9pcqeA0598.jpg

- grep 在处理 {n,m} 需用 \{  \} 处理 egrep 则不需.

诸如此类的... 我个人会建议能用 egrep 就不用 grep ..        

第三式:fgrep

不作 RE 处理表达式仅作一般字符串处理所有 meta 均失去功能.

 ============================================================================

PS:以上是本人学习整理内容,由于能力有限,如有错漏,欢迎各种砖头瓦块.a_c










本文转自 jinlinger 51CTO博客,原文链接:http://blog.51cto.com/essun/1361920,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Linux的正则表达式grep,egrep
一、概念 正则表达式是对字符串操作的一种逻辑公式,用事先定义好的一组特殊字符,组成一个“规则字符集合”,根据用户指定的文本模式对目标文件进行逐行搜索匹配,显示能被模式匹配到的结果。 给定一个正则表达式和另一个目标字符串,我们可以从给定的字符串中通过匹配模型,过滤字符串中不想要的的字符串,得到目标字符串,减少工作量。
731 0
Python(二)常用的正则表达式
Python(二)常用的正则表达式
0 0
Python字符串和正则表达式的深入学习
Python字符串和正则表达式的深入学习
0 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载