正则表达式
1.正则表达式概念
正则表达式是一种描述文本字符串或模式的方式,这样程序就可以将该模式与任意文本字符串相匹配,提供非常强大的搜索能力。
2.支持的程序
grep、sed、awk 、vim、less、nginx、varnish等
3.分类
基本正则表达式:
BRE(basic regular expression)
只承认的元字符有^、$、[]、*其他字符识别为普通字符
扩展正则表达式:
ERE(extended regular expression)
添加了(){}?+|等
PS:只有在用反斜杠进行转义的情况下,字符(){}才会被BRE当作元字符处理,而在ERE中,任何元符号前面加上反斜杠反而会时期当作普通字符处理
4.基本用法
正则表达式是从字符和运算构建的,并通过元字符来扩充,大部分字符都匹配自己,大部分元字符必须使用反斜杠\来转义。使用正则表达法时,需要留意一下语系,因为不同语系的编码数据不同,我们常用的是LANG=C。
普通字符
字母、数字、下划线以及没有特殊定义的符号,都是普通字符,表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符
例1:表达式“c”,在匹配字符串“zbcde”时,匹配结果为’c’
•字符匹配
符号 | 含义 |
---|---|
. | 匹配任意单个字符 |
[ ] | 匹配指定范围内的任意单个字符 |
[^] | 匹配指定范围外的任意单个字符 |
[:alnum:] | 字母和数字 |
[:alpha:] | 代表任何英文大小写字符,即a-z,A-Z |
[:lower:] | 小写字母 |
[:upper:] | 大写字母 |
[:blank:] | 空白字符(空格和制表符) |
[:space:] | 水平和垂直的空白字 |
[:cntrl:] | 不可打印的控制字符(退格、删除、警铃) |
[:digit:] | 十进制数字 |
[:xdigit:] | 十六进制数字 |
[:graph:] | 可打印的非空白字符 |
[:print:] | 可打印字符 |
[:punct:] | 标点符号 |
字符转义
一些不便书写的字符,采用在前面加‘\‘的方法
表达式 | 可匹配 |
---|---|
\r,\n | 代表回车和换行 |
\t | 制表符 |
\|代表| |
还有一些有特殊用处的符号,在前面加’\’后,就代表该符号本身。比如:^,$,.等,这些转义字符的匹配方法与普通字符串类似,匹配与之相同的一个字符。
表达式 | 可匹配 |
---|---|
\^ | ^本身 |
$ | $本身 |
. | .本身 |
自定义能够匹配“多种字符”的表达式
使用中括号[]包含一系列字符,能够匹配其中任意一个字符。用[^]包含一系列字符,则能匹配其中字符之外的任意一个字符。
表达式 | 可匹配 |
---|---|
[abc] | a或b或c |
[^abc] | a、b、c之外的任意一个字符 |
[^A-F0-3] | A-F,0-3之外的任意字符 |
•匹配次数(重复)
使用表达式再加上修饰匹配次数的特殊符号,就不用重复书写表达式就可以重复匹配。
符号 | 含义 |
---|---|
* | 匹配前面的字符任意次包括0次 |
.* | 任意长度的任意字符 |
\? | 匹配其前面的字符0或1次 |
+ | 匹配前面的字符至少1次 |
{m,n} | 匹配前面的字符至少m次,至多n次 |
{n} | 匹配前面的字符n次 |
{,n} | 匹配前面的字符至多n次 |
{n,} | 匹配前面的字符至少n次 |
例2:a*b这样的表达式将匹配任何在a后以b结尾的字符串,包括b本身(0个a后跟b的字符串)
例3:用正则表达式来表示ip地址
最后一串字符表达的意思为[0-9]任意字符出现{1-3}次加“.”,连续出现3次\{3\},最后再接一个不带点的第一段字符
[root@V9centos7 ~]$ifconfig ens33|grep -w inet|grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'
172.16.253.231
255.255.0.0
172.16.255.255
位置锚定:定位出现的位置
符号 | 含义 |
---|---|
^ | 行首锚定,用于模式的最左侧 |
$ | 行尾锚定,用于模式的最右侧 |
^pattern$ | 用于模式匹配整行 |
^$ | 空行 |
^[[:space:]]*$ | 空白行 |
\<或\b | 词首锚定,用于单词模式的左侧 |
\>或\b | 词尾锚定,用于单词模式的右侧 |
\ | 匹配整个单词 |
例题4:取出光盘目录Packages目录中以.rpm结尾的文件,并统计前面的一段字符串,出现次数并统计
ls /misc/cd/Packages/|grep -o'[^.]\+\.rpm$'|sort|uniq -c
PS:/misc为光盘临时挂载点,利用行尾锚定,来筛选题目要求
例题5:过滤掉文件f1空行,包括带空格以及tab的
[root@V9centos7 /data]$cat -A f1
abc cba$
$
help $
^I^I$
USB^I$
$
[root@V9centos7 /data]$grep -v '^[[:space:]]*$' f1
abc cba
help
USB
分组:
\(\)将一个或多个字符捆绑在一起,当做一个整体进行处理
例题:IP地址的大概表达,不精确,以后的章节会有精确表达式
'([0-9]{1,3}\.){3}[0-9]{1,3}'
后项引用
分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部变量中,这些变量命名方式为:\1,\2,\3…
\1表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配的字符
例题:\1匹配的是前面\(r..\)的最终结果,例如例子中匹配到的roo,后面的\1也将匹配roo,而不是r..
echo "aa roo xx ryy"|grep "\<\(r..\).*\1"匹配不到
echo "aa roo xx roo"|grep "\<\(r..\).*\1"匹配成功
aa roo xx roo匹配到的结果
5.扩展正则表达式
扩展正则表达式消除了像在基本语法中使用时一样转义一些字符的需要,包括()、?、+、|{}。
缺点是如果想在正则表达式中将他们解释为字符,则必须转义他们,我们可以使用grep -E或者egrep来指定在使用的是扩展正则表达式
6.或的表示方法
使用符号 | 将需要选择的模式隔开
例题:匹配文件f1中的xyzab或xyzdf或xyzef。
[root@V9centos7 /data]$grep -o "xyz\ab|cd|ef" f1
xyzab cd ef
[root@V9centos7 /data]$grep "xyz\(ab|cd|ef\)" f1
xyzab xyzcd xyzef
[root@V9centos7 /data]$cat f1
xyzab xyzcd xyzef
7.贪婪与懒惰
当正则表达式包含能接受重复的符号时,通常是尽可能多的匹配字符。
例:a.*b,用它来搜索aababaaab,
它会匹配整个字符串。