正则表达式,又称正规表达式、常规表达式
使用字符串描述、匹配一系列符合某个规则的字符串
普通字符: 大小写字母、数字、标点符号及一些其它符号
元字符: 在正则表达式中具有特殊意义的专用字符
正则表达式的层次分类
基础正则表达式
扩展正则表达式
Linux三剑客(grep、sed、awk)支持的正则表达式
支持正则的shell命令 | 正则类型 |
---|---|
grep | 默认使用基本正则表达式(BRE)(要使用扩展正则需要加转义字符) |
egrep 或grep -E | 使用扩展的正则表达式(ERE) |
sed | 默认使用基本正则表达式(BRE) |
awk | 使用扩展正则表达式(ERE) |
\ : 表示转义字符,去掉特殊符号的特殊含义
\n : 匹配换行符
\t : 匹配制表符
\w : 匹配单词字符(单词字符:a-z,A-Z,0-9,_ )
\W : 匹配非单词字符
\S : 匹配非空白字符
\s : 匹配空白字符
\d : 匹配数字
\D : 匹配非数字
. : 表示匹配任意单个字符(默认情况下,. 无法匹配换行符)
字符组: 普通中括号包围的字符组,表示某个单个字符匹配中括号内的任意字符即匹配成功
x[abc]z : 可以匹配包含“xaz”、“xbz”、“xcz”的字符串
取反表示法: 中括号内开头使用 ^ ,表示只要不是中括号内的字符就匹配
x[ ^abc]z : 可以匹配包含 “xdz”、“xez” 等字符串,但不能匹配包含“xaz”、“xbz”、“xcz”的字符串
范围表示法
[a-z]: 表示任意单个小写字母
[ ^a-z] : 匹配非小写字母的其它任意字符串
[A-Z] : 表示任意单个大写字符
[0-9] : 表示任意单个数字
注意:[0-59],表示匹配0、1、2、3、4、5、9,而不是0-59中间的数值
[a-z0-9A-Z] : 表示任意字母或数字
[a-z0-9A-Z_] : 表示任意字符、数字或下划线,也就是匹配单个字符
特殊的元字符在中括号中匹配
想要在中括号中匹配: ^ ,需要将其放在 中括号非开头的位置 ,
想要在中括号中匹配: - ,需要将其放在 开头位置或结尾位置 ,
想要在中括号中匹配: ] ,需要将其放在 开头位置 ,
只匹配位置,不匹配字符,所以不会消耗字符数量,也称为零宽断言
{m} : 表示匹配前一个字符或前一个子表达式m次
{m,n} : (m
{m,} : 表示匹配前一个字符或前一个子表达式至少m次
{,n} : 表示匹配前一个字符或前一个字表达式最多n次(匹配0次也算是成功)
*: 表示前一个字符或前一个子表达式匹配0次或多次,等价于:{0,}
.* : 匹配任意长度的任意字符
竖线 | 分隔左右两个正则子表达式,表示匹配任何一个即可,即a|b表示:a或者b,在结果上等价[ab];但是:[0-5] |\sa 表示0、1、2、3、4、5 或者 “ a”,这种转化不了为[]的形式。
使用二选一子表达式需要注意:
二选一元字符优先级很低,所以abc|def 表示的是abc或者def,等价于:(abc)|(def),而不是ab(c|d)ef。
使用小括号()包围一部分正则表达式,这部分正则表达式即成为一个分组整体,也称为一个子表达式。
根据左括号的位置决定第几个分组
分组后可以使用\N 来反向引用对应的分组匹配结果,N是1-9的正整数,\1表示第一个分组表达式的匹配结果,\2表达第二个分组表达式的匹配结果。
grep是一种强大的文本搜索工具,它能使用正则表达式,并把匹配的行打印出来。
格式
grep [options] pattern [file]
options表示:选项; pattern 表示:匹配的的表达式 ; file 表示:文件名
例如:grep -i “root” /etc/passwd
常用选项 | 功能 |
---|---|
-n | 列出所匹配的文本行,并显示行号 |
-i | 匹配时忽略字符大小写 |
-v | 反向匹配,匹配的字符串与搜索的不相符 |
-w | 精确匹配。匹配整个单词 |
-o | 只显示匹配的部分 |
-c | 显示匹配内容的行数 |
案例:过滤出/etc/passwd中的root,并添加行号(-n)
案例:过滤出/etc/passwd 中的FTP,不区分大小写(-i)
案例:过滤/etc/passwd 中的不包含root的行,并且显示行号(-v)
案例:精准搜索单词,只匹配到单词所在的行(-w)
案例:将匹配到的单词罗列出来(-o)
①grep -n “sh[io]rt” test.txt
②查找包含重复单个字符“oo”
③查找“oo”前面不是“w”的字符串
查找包含数字的行
①查找以the开头的行
grep -n ‘^$’ test.txt
grep -n ‘.$’ test.txt 查找以.结尾的行
①查找以 w 开头 d 结尾 grep -n ‘w…d’ test.txt
查询以 w 开头 d 结尾,中间的字符可有可无的字符串
2195156733)]
①查找以 w 开头 d 结尾 grep -n ‘w…d’ test.txt
[外链图片转存中…(img-FsRJIKBU-1662195156734)]
查询以 w 开头 d 结尾,中间的字符可有可无的字符串
[外链图片转存中…(img-96sA6jVO-1662195156734)]