一、总纲(何为正则)
所谓正则,又称正则表达式、正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。(维基百科如是说)
为了便于理解,可以将正则想象成为普通语言,普通字符对应的是普通文字,而元字符则对应语法,根据语言的规则,按照语法将文字组合起来,就会表述出你想说的话即想要的文本。
第一式 grep是什么
grep(global search regular expression(RE)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。UNIX的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符,fgrep就是fixed grep或fast grep,它们把所有的字母都看做单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。
格式:
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
第一招:常用选项[OPTIONS]
-v: 反向,显示不能被模式所匹配到的行;

-o: 仅显示被模式匹配到的字串,而非整行;
1
2
|
grep -o "rpcuser" /etc/passwd
|

-i: 不区分字符大小写, ignore-case
1
2
|
grep --color -i "u..d" /etc/fstab
|

-E: 支持扩展的正则表达式(加-E可以使用grep启用egrep的功能 grep -E)
-A #:之后的几行字符

-B:之前的几行字符

-C #:上下两行

-n: 显示匹配行及行号,在显示出内容的每行前面会显示行数
第二招:模式(PATTERN)
元字符:不表示字符本身的意义,用于额外功能性的描述
字符匹配:
.: 任意单个字符
1
2
|
grep --color "r..t" /etc/passwd
|

[ ]: 指定范围内的任意单个字符
1
2
|
grep --color "[sS].s" /etc/fstab
|
[[:digit:]] 匹配任何一个数字([0-9]
1
|
grep --color "jin[[:digit:]]" /etc/passwd
|

[[:alnum:]] 匹配任何一个字母或数字([A-Za-z0-9])
[[:alpha:]] 匹配任何一个字母([A-Za-z])
[[:lower:]] 匹配任何一个小写字母([a-z])
[[:upper:]] 匹配任何一个大写字母([A-Z])
[[:space:]] 任何一个空白字符:制表符、空格
[[:punct:]] 任何一个标点符号(不包括:[:alnum:]、[:cntrl:]、[:space:]字符集)
[^]:指定范围外的任意单个字符
1
2
|
grep --color "^[^[:punct:]].*" /etc/selinux/config
|

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

$: 锚定行尾
1
2
|
以 bash 结尾的行
grep --color "bash$" /etc/passwd
|

^$: 空白行
1
2
|
grep "^$" /etc/init/tty .conf | wc -l
|

\<char: 锚定词首,也可以写成\bchar(注:\b是元字符)
1
2
|
grep --color "\br..t" /etc/passwd
|

char\>: 锚定词尾,char\b(注:\b也可以用于锚定词尾)
1
2
|
grep --color "^...s\b" /etc/passwd
|

次数匹配:用来指定匹配其前面的字符的次数
*: 任意次(0次或多次)
1
2
|
grep --color ab*bd test .txt
|

.*: 匹配任意长度的任意字符
1
2
|
grep --color "a\?b" test .txt
|

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

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

\{m,\}: 至少m次;
\{0,n\}:至多n次;
分组:
\(\)
1
2
|
grep --color "w\(es\).*\1" test .txt
|

(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
|
grep --color '\(1\|2\)' /etc/inittab
grep --color -E '(1|2)' /etc/inittab
|

- grep 在处理 {n,m} 时, 需用 \{ 与 \} 处理, 但 egrep 则不需.
诸如此类的... 我个人会建议能用 egrep 就不用 grep 啦..
第三式:fgrep
不作 RE 处理, 表达式仅作一般字符串处理, 所有 meta 均失去功能.
===================================完=========================================
PS:以上是本人学习整理内容,由于能力有限,如有错漏,欢迎各种砖头瓦块.a_c