**正则表达式:Regual Expression,简写REGEXP**
由一类特殊字符及文本字符编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或通配的功能:
分两类:
基本正则表达式:BRE
扩展正则表达式:ERE
元字符:\(hello[[:space:]]\+\)\+
grep: Global search REgulae expresslon and Print out the line
作用:文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查;打印匹配到的行;
模式:由正则表达式的元字符所及文本字符编写出的过滤条件:
正则表达式引擎:
grep [options] PATTERN [FILE...]
grep [options] [-e PATTERN | -f FILE] [FILE...]
OPTIONS:
--color=auto:对匹配到的文本着色后高亮显示:
-i:ignorecase,忽略字符的大小写:
-o:仅显示匹配到的字符串本身:
-v, --invert-match:显示不能被模式匹配到的行:
-E, --extended-regexp:支持使用扩展的正则表达式元字符:
-q, --quiet, --silent:静默模式,即不输出任何信息
-A#:after,后#行
-B#: before,前#行
-C#:context,前后各#行
基本正则表达式元字符:
字符匹配:
.:匹配任意单个字符:
[]: 匹配指定范围内的任意单个字符:
[^]: 匹配制定范围外的任意单个字符
[:digit:]、[:lower:]、[:upper:]、[:alpah:]、[:alunum:]、[:punct:]、[:space:]
匹配次数:用在要指定其出现的次数的字符的后面,用于限制器前面字符出现的次数:默认工作与贪婪模式:
*:匹配其前面的字符任意次:0,1多次:
例如:grep "x*y"
.*: 匹配任意长度任意字符
\?:匹配其前面的字符0次或1次:即其前面的字符是可有可无的:
\+:匹配其前面的字符1次或多次;及前面的字符要出现至少一次
\{m\}:匹配前面字符m次
\{m,n\}:匹配前面字符至少m次,至多n次:
\{0,n\}:至多n次:
\{m,\}:至少m次:
位置锚定:
^:行首锚定:用于要写在模式的最左侧:
$:行尾锚定:用于要写在模式的最右侧:
^PATTERN$: 用PATTERN来匹配整行“
^$:空白行:
^[[:space:]]*$:空白行或包含空白字符的行:
单词:非特殊字符组成的连续字符串(字符串)都称为单词:
\<或\b:词首锚定,用于单词模式的左侧:
\>或\b: 词尾锚定,用于单词模式的右侧:
\
分组及引用:
\(\):将一个或多个字符捆绑在一起,当作一个整体进行处理:
\(xy\)*ab
注意:分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为:
\1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符
\2:模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符
\3
...
He loves his lover.
He likes his lover.
She likes ker liker.
She loves her liker
~]#grep "\(l..e).*\1" lovers.txt
后向引用:引用前面的分组括号的模式所匹配到的字符:
示例:
1.显示/etc/passwd文件中不以/bin/bash结尾的行:
~]#grep -v "bin/bash" /etc/passwd
2.找出/etc/passwd文件中两位数或三位数;
~]#grep "\<[0-9]\{2,3\}\>" /etc/passwd
3.找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg.文件中,至少以一个空白字符开头,且后面非空白字符的行:
~]#grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg
4.找出"netstat -tan"命令中以‘LISTEN’后跟0,1或多个空白字符结尾的行
netstat -tan | grep "LISTEN[[:space:]]*$"