文本检索秘技之正则表达式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,如需转载请自行联系原作者
目录
相关文章
|
2月前
|
存储 算法 Shell
【Shell 命令集合 文档编辑】Linux 正则表达式匹配 egrep命令使用教程
【Shell 命令集合 文档编辑】Linux 正则表达式匹配 egrep命令使用教程
12 0
|
2月前
|
运维 Unix Linux
grep正则表达式搜索
grep正则表达式搜索
17 3
|
7月前
|
Linux Perl
[笔记]linux grep之正则表达式
[笔记]linux grep之正则表达式
|
8月前
|
Unix Linux
如何在 Linux 中使用 Grep 和正则表达式进行文本搜索?
如何在 Linux 中使用 Grep 和正则表达式进行文本搜索?
199 5
|
11月前
|
机器学习/深度学习 NoSQL Linux
Linux行处理工具: grep 正则表达式
Linux行处理工具: grep 正则表达式
83 0
|
11月前
|
机器学习/深度学习 C语言 数据安全/隐私保护
『正则表达式』概念 及在grep、awk、sed、C语言、Python中的简单应用
正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),是一种文本模式。它可以用来检查一个字符串是否符合某个规则,或者从一个字符串中提取出符合某个规则的子串。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。 正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。
|
机器学习/深度学习 移动开发 Go
正则表达式使用说明(包含find命令与grep命令)
正则表达式使用说明(包含find命令与grep命令)
113 0
|
自然语言处理 Shell Perl
Shell正则表达式(grep)
Shell正则表达式(grep)
53 0
|
机器学习/深度学习 Linux Perl
Linux三剑客grep、sed、awk以及正则表达式
$ 以...结尾 ^ 以...开头 . 匹配任意一个字符 \- 匹配前一个字符或子表达式任意次(例如:grep "g.*d" a.txt(过滤a.txt文件中的以g开头以d结尾*可以代表有任意多个字符或没有字符))
120 0
Linux三剑客grep、sed、awk以及正则表达式
|
机器学习/深度学习 Shell Linux