详解基于Linux下正则表达式(基本正则和扩展正则命令使用实例)
前言
正则表达式应用广泛,在绝大多数的编程语言都可以完美应用,在Linux中,也有着极大的用处。
使用正则表达式,可以有效的筛选出需要的文本,然后结合相应的支持的工具或语言,完成任务需求。
在本篇博客中,我们使用grep/egrep来完成对正则表达式的调用,其实也可以使用sed等工具,但是sed的使用极大的需要正则表达式,为了在后面sed篇的书写,就只能这样排序了,有需要的朋友可以把这两篇一起来看。
正则表达式的类型
正则表达式可以使用正则表达式引擎实现,正则表达式引擎是解释正则表达式模式并使用这些模式匹配文本的基础软件。
在Linux中,常用的正则表达式有:
-POSIX基本正则表达式(BRE)引擎
-POSIX扩展正则表达式(BRE)引擎
基本正则表达式的基本使用
环境文本准备
[root@service99~]#mkdir/opt/regular [root@service99~]#cd/opt/regular [root@service99regular]#pwd /opt/regular [root@service99regular]#cp/etc/passwdtemp_passwd
纯文本
纯文本可以完全匹配对应的单词,需要注意的有正则表达式模式严格区分大小写。
//grep--color主要是可以将匹配到的文本高亮显示,这样便于观察效果 [root@service99regular]#grep--color"root"temp_passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin
在正则表达式中,不必局限于完整的单词,所定义的文本出现在数据流的任意位置,正则表达式都将匹配。
[root@service99regular]#ifconfigeth1|grep--color"add" eth1Linkencap:EthernetHWaddr54:52:01:01:99:02 inetaddr:192.168.2.99Bcast:192.168.2.255Mask:255.255.255.0 inet6addr:fe80::5652:1ff:fe01:9902/64Scope:Link
当然也不必局限于单独的单词,也可以在文本字符串中出现空格和数字。
[root@service99regular]#echo"Thisislinenumber1"|grep--color"ber1" Thisislinenumber1
特殊字符
在正则表达式模式中使用文本字符串时,有一个问题需要注意。
在正则表达式中定义文本字符串时有几个例外,正则表达式赋予了它们特殊的含义,如果在文本中使用这些特殊字符,有可能得不到预期的效果。
正则表达式认可的特殊字符:
.*[]^${}+?|()
如果想要使用这些特殊字符作为普通的文本字符,就需要转义(escape)它,即是在该字符前添加一个特殊字符,向正则表达式引擎说明:它应该将下一个字符解释为普通文本字符。
实现该功能的特殊字符是:“\”反斜杠字符
[root@service99regular]#echo"Thiscatis$4.99"//双引号不会屏蔽特殊符号,所以系统会读取变量4.99的值,然而当前系统并没有该变量,就显示为空 Thiscatis.99 [root@service99regular]#echo"Thiscatis\$4.99"//使用"\"转义$ Thiscatis$4.99 [root@service99regular]#echo'Thiscatis\$4.99'//单引号屏蔽元字符$ Thiscatis\$4.99 [root@service99regular]#echo'Thiscatis$4.99' Thiscatis$4.99 [root@service99regular]#catprice.txt Thispriceis$4.99 hello,world! $5.00 #$#$ Thisis"\". [root@service99regular]#grep--color'\\'price.txt Thisis"\".
定位符
从头开始
脱字符(^)尖角号定义从数据流中文本行开头开始的模式。
[root@service99regular]#grep--color'^h'price.txt//以字母h开头的行 hello,world! [root@service99regular]#grep--color'^$'price.txt//无输出结果,由于没有屏蔽特殊含义 [root@service99regular]#grep--color'^\$'price.txt//以$符号开头的行 $5.00 [root@service99regular]#echo"Thisis^test.">>price.txt [root@service99regular]#catprice.txt Thispriceis$4.99 hello,world! $5.00 #$#$ Thisis"\". Thisis^test. [root@service99regular]#grep--color'^'price.txt//直接使用会显示所有的内容 Thispriceis$4.99 hello,world! $5.00 #$#$ Thisis"\". Thisis^test. [root@service99regular]#grep--color'\^'price.txt//单独使用,并在最前面时需要屏蔽 Thisis^test. [root@service99regular]#grep--color'is^'price.txt//符号不在最前面时,无需屏蔽,直接使用即可 Thisis^test.
查找结尾
美元符号$特殊字符定义结尾定位,在文本模式之后添加这个特殊字符表示数据行必须以此文本模式结束。
[root@service99regular]#grep--color'\.$'price.txt//“.”在正则表达式中也有特殊含义,请屏蔽,具体的请往下看 Thisis"\". [root@service99regular]#grep--color'\.$'price.txt//由于我在输入的时候,多加了一个空格,所以各位需要慎重和小心 Thisis^test.//在正则表达式中,空格作为字符计。 [root@service99regular]#grep--color'0$'price.txt $5.00 [root@service99regular]#grep--color'9$'price.txt Thispriceis$4.99
联合定位
比较常用的就是“^$”表示空行
结合“^#”,由于#在Linux代表注释
输出该文本的有效配置
[root@service99regular]#cat-n/etc/vsftpd/vsftpd.conf|wc-l 121 [root@service99regular]#grep-vE'^#|^$'/etc/vsftpd/vsftpd.conf//v表示反选,E表示支持扩展正则“|”是扩展正则的符号,往下看,后面有 anonymous_enable=YES local_enable=YES write_enable=YES local_umask=022 anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES anon_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES listen=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES
字符出现范围
{n,m}//前一个字符出现了n到m次
{n,}//前一个字符出现了n次以上
{n}//前一个字符出现了n次
[root@service99regular]#grep--color"12345\{0,1\}"price.txt 1234556 [root@service99regular]#grep--color"12345\{0,2\}"price.txt 1234556
点字符
点特殊字符用于匹配除换行符之外的任意单个字符,但点字符必须匹配一个字符;如果在圆点位置没有字符,那么模式匹配失败。
[root@service99regular]#grep--color".s"price.txt Thispriceis$4.99 Thisis"\". Thisis^test. [root@service99regular]#grep--color".or"price.txt hello,world!
字符类
字符类可以定义一类字符来匹配文本模式中的某一位置。如果在字符类中的某一字符在数据流中,就和模式匹配。
为定义字符类,需要使用方括号。应该将要包括在该类中的所有字符用方括号括起来,然后模式中使用整个字符类,就像任意的其他通配符一样。
[root@service99regular]#grep--color"[abcdsxyz]"price.txt Thispriceis$4.99 hello,world! Thisis"\". Thisis^test. [root@service99regular]#grep--color"[sxyz]"price.txt Thispriceis$4.99 Thisis"\". Thisis^test. [root@service99regular]#grep--color"[abcd]"price.txt Thispriceis$4.99 hello,world! [root@service99regular]#grep--color"Th[ais]"price.txt//Th后的第一个字符在【ais】中匹配的 Thispriceis$4.99 Thisis"\". Thisis^test. [root@service99regular]#grep-i--color"th[ais]"price.txt//-i表示不区分大小写 Thispriceis$4.99 Thisis"\". Thisis^test.
如果不能确定某个字符的大小写,就可以使用该模式:
[root@service99regular]#echo"Yes"|grep--color"[yY]es"[]内字符顺序没有影响 Yes [root@service99regular]#echo"yes"|grep--color"[Yy]es" yes
在单个表达式内可以使用多个字符类:
[root@service99regular]#echo"Yes/no"|grep"[Yy][Ee]" Yes/no [root@service99regular]#echo"Yes/no"|grep"[Yy].*[Nn]"//*在正则表达式中的用法,请往下看 Yes/no
字符类对数字同样支持:
[root@service99regular]#echo"Myphonenumberis123456987"|grep--color"is[1234]" Myphonenumberis123456987 [root@service99regular]#echo"ThisisPhone1"|grep--color"e[1234]" ThisisPhone1 [root@service99regular]#echo"ThisisPhone1"|grep--color"[1]" ThisisPhone1
字符类还有一种极为常见的用途是解析可能拼错的单词:
[root@service99regular]#echo"regular"|grep--color"r[ea]g[ua]l[ao]" regular
否定字符类
用于查找不在该字符类中的字符,只需在字符类范围的开头添加脱字符(^).
即使使用否定,字符类仍必须匹配一个字符。
[root@service99regular]#catprice.txt Thispriceis$4.99 hello,world! $5.00 #$#$ Thisis"\". thisis^test. cat car [root@service99regular]#sed-n'/[^t]his/p'price.txt Thispriceis$4.99 Thisis"\". [root@service99regular]#grep--color"[^t]his"price.txt Thispriceis$4.99 Thisis"\". [root@service99regular]#grep--color"ca[tr]"price.txt cat car [root@service99regular]#grep--color"ca[^r]"price.txt cat
使用范围
当你需要匹配的字符很多并且有一定规律时,可以这样:
[root@service99regular]#catprice.txt Thispriceis$4.99 hello,world! $5.00 #$#$ Thisis"\". thisis^test. cat car 1234556 911 11806 [root@service99regular]#egrep--color'[a-z]'price.txt Thispriceis$4.99 hello,world! Thisis"\". thisis^test. cat car [root@service99regular]#egrep--color'[A-Z]'price.txt Thispriceis$4.99 Thisis"\". [root@service99regular]#grep--color"[0-9]"price.txt Thispriceis$4.99 $5.00 1234556 911 11806 [root@service99regular]#sed-n'/^[^a-Z]/p'price.txt $5.00 #$#$ 1234556 911 11806 [root@service99regular]#grep--color"^[^a-Z]"price.txt $5.00 #$#$ 1234556 911 11806 [root@service99regular]#echo$LANG//在使用[a-Z]时,注意LANG环境变量的值,该值若是进行修改的话,要注意修改的值的合法性 zh_CN.UTF-8 [root@service99regular]#LANG=en_US.UTF-8
特殊字符类
用于匹配特定类型的字符。
[[:blank:]]空格(space)与定位(tab)字符
[[:cntrl:]]控制字符
[[:graph:]]非空格(nonspace)字符
[[:space:]]所有空白字符
[[:print:]]可显示的字符
[[:xdigit:]]十六进制数字
[[:punct:]]所有标点符号
[[:lower:]]小写字母
[[:upper:]]大写字母
[[:alpha:]]大小写字母
[[:digit:]]数字
[[:alnum:]]数字和大小写字母
星号
在某个字符之后加一个星号表示该字符在匹配模式的文本中不出现或出现多次
[root@service99regular]#cattest.info goole gogogo comeon goooooooooo [root@service99regular]#grep--color"o*"test.info goole gogogo comeon goooooooooo [root@service99regular]#grep--color"go*"test.info goole gogogo goooooooooo [root@service99regular]#grep--color"w.*d"price.txt//经常与.一起使用 hello,world!
扩展正则表达式
问号
问号表示前面的字符可以不出现或者出现一次。不匹配重复出现的字符。
[root@service99regular]#egrep--color"91?"price.txt Thispriceis$4.99 911
加号
加号表示前面的字符可以出现一次或者多次,但必须至少出现一次,该字符若是不存在,则模式不匹配。
[root@service99regular]#egrep--color"9+"price.txt Thispriceis$4.99 911 [root@service99regular]#egrep--color"1+"price.txt 1234556 911 11806
使用大括号
使用大括号指定对可重复的正则表达式的限制,通常称为间隔。
-m:该正则表达式正好出现m次
-m,n:该正则表达式出现最少m次,最多n次
[root@service99regular]#echo"Thisistest,testisfile."|egrep--color"test{0,1}" Thisistest,testisfile. [root@service99regular]#echo"Thisistest,testisfile."|egrep--color"is{1,2}" Thisistest,testisfile.
正则表达式实例
这里有一个实例,对基本的正则表达式进行了练习和实例。
因为正则表达式,单看概念或者理论还是比较简单的,然而在实际的使用中,却不是那么好用,一旦用好了,对效率的提升绝对时可观的。
1.过滤下载文件中包含the关键字
grep--color"the"regular_express.txt
2.过滤下载文件中丌包含the关键字
grep--color-vn"the"regular_express.txt
3.过滤下载文件中丌论大小写the关键字
grep--color-in"the"regular_express.txt
4.过滤test或taste这两个单字
grep--color-En'test|taste'regular_express.txt grep--color-i"t[ae]ste\{0,1\}"1.txt
5.过滤有oo的字节
grep--color"oo"regular_express.txt
6.过滤丌想要oo前面有g的
grep--color[^g]"oo"regular_express.txt grep--color"[^g]oo"regular_express.txt
7.过滤oo前面丌想有小写字节
egrep--color"[^a-z]oo"regular_express.txt
8.过滤有数字的那一行
egrep--color[0-9]regular_express.txt
9.过滤以the开头的
egrep--color^theregular_express.txt
10.过滤以小写字母开头的
egrep--color^[a-z]regular_express.txt
11.过滤开头丌是英文字母
egrep--color^[^a-Z]regular_express.txt
12.过滤行尾结束为小数点.那一行
egrep--color$"\."regular_express.txt
13.过滤空白行
egrep--color"^$"regular_express.txt
14.过滤出g??d的字串
egrep--color"g..d"regular_express.txt
15.过滤至少两个o以上的字串
egrep--color"ooo*"regular_express.txt egrep--coloro\{2,\}regular_express.txt
16.过滤g开头和g结尾但是两个g之间仅存在至少一个o
egrep--colorgo\{1,\}gregular_express.txt
17.过滤任意数字的行
egrep--color[0-9]regular_express.txt
18.过滤两个o的字串
egrep--color"oo"regular_express.txt
19.过滤g后面接2到5个o,然后在接一个g的字串
egrep--colorgo\{2,5\}gregular_express.txt
20.过滤g后面接2个以上o的
egrep--colorgo\{2,\}regular_express.txt
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。