![16955089-9956883198b30700.png](https://i-blog.csdnimg.cn/blog_migrate/61812ef0a157b07e6f62b24508248b4e.png)
正则表达式含义(Regular Expression RE)
发明1套符号,不同的符号不同的含义,方便我们在文件中查找/过滤内容
正则表达式的分类
基础正则(Basic E)
扩展正则(Extended RE======ERE)
通配符与正则的区别
通配符 | 正则 | |
---|---|---|
作用 | 是方便我们进行查找文件 | 方便我们进行过滤(在文件中找内容) |
支持的命令 | Linux下面大部分命令可以支持 | 是给Linux三剑客或开发语言(Python Go PHP JAVA)使用 |
使用正则时的注意事项
注意中文符号
给grep和egrep加上颜色(CentOS 7 系统完成;CentOS 6 自己添加别名)
创建环境:
cat >>oldboy.txt<<EOF
>I am oldboy teacher!
>I teach linux.
>
>I like badminton ball ,billiard ball and chinese chess!
>my blog is http://oldboy.blog.51cto.com
>our size is http://blog.oldboyedu.com
>my qq is 49000448
>
>not 4900000448.
>my god ,i am not oldbey,but OLDBOY
>dfdfdkj343433#@#@#@#$%%%^%&^&&**()
>god
>gd
>EOF
1、基础正则(Basic E)※※※※※
^
以……开头的行,如^m或 ^oldboy
[root@oldboyedu59 ~]# #在这个文件中找出以ssh开头的行
[root@oldboyedu59 ~]# grep '^ssh' /etc/services
ssh 22/tcp # The Secure Shell (SSH) Protocol
ssh 22/udp # The Secure Shell (SSH) Protocol
ssh 22/sctp # SSH
sshell 614/tcp # SSLshell
sshell 614/udp # SSLshell
ssh-mgmt 17235/tcp # SSH Tectia Manager
$
以……结尾的行,如m
[root@oldboyedu59 /oldboy]# grep ' ' oldboy.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldboyedu.com
my qq is 49000448
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
[root@oldboyedu59 /oldboy]#
[root@oldboyedu59 /oldboy]# grep 'm $' oldboy.txt
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldboyedu.com
[root@oldboyedu59 /oldboy]# cat -A oldboy.txt
I am oldboy teacher!$
I teach linux.$
$
I like badminton ball ,billiard ball and chinese chess!$
my blog is http://oldboy.blog.51cto.com $
our size is http://blog.oldboyedu.com $
my qq is 49000448$
$
not 4900000448.$
my god ,i am not oldbey,but OLDBOY! $
^$
空行
这一行什么都没有(排除空行)
[root@oldboyedu59 /oldboy]# grep '^$' oldboy.txt
[root@oldboyedu59 /oldboy]#
.(点)
任意一个字符
不会匹配出空行
grep -o :显示grep每次过滤出什么内容,显示grep的执行过程
[root@oldboyedu59 /oldboy]# grep -n '.' oldboy.txt
1:I am oldboy teacher!
2:I teach linux.
4:I like badminton ball ,billiard ball and chinese chess!
5:my blog is http://oldboy.blog.51cto.com
6:our size is http://blog.oldboyedu.com
7:my qq is 49000448
9:not 4900000448.
10:my god ,i am not oldbey,but OLDBOY
11:dfdfdkj343433#@#@#@#$%%%^%&^&&**()
[root@oldboyedu59 /oldboy]#
\ 转义字符
去掉符号原有特殊意思
转移字符系列
\n 回车
\t 按tab键
如:把oldboy.txt回车替换为\t
[root@oldboyedu59 /oldboy]# tr '\n' '\t'< oldboy.txt
I am oldboy teacher! I teach linux. I like badminton ball ,billiard ball and chinese chess! my blog is http://oldboy.blog.51cto.com our size is http://blog.oldboyedu.com my qq is 49000448 not 4900000448. my god ,i am not oldbey,but OLDBOY dfdfdkj343433#@#@#@#$%%%^%&^&&**() god gd [root@oldboyedu59 /oldboy]# ‘
echo
-n
不输出每行结尾的回车
-e
让echo支持转义字符\n\t
[root@oldboyedu59 /oldboy]# echo -e "oldboy\noldgirl\nalex\nlidao"
oldboy
oldgirl
alex
lidao
[root@oldboyedu59 /oldboy]# echo -e "oldboy\noldgirl\nalex\n\t\t\tlidao"
oldboy
oldgirl
alex
*
前1个字符连续出现0次或0次以上(连续出现====重复(repetition))
000
0000000000
连续出现的0
oldboy
连续出现的字母
.*(点星)
所有 任意字符
特点:贪婪性(能匹配多少就匹配多少)
什么时候会有贪婪性?正则表达式表示所有(.*)或者是连续出现的时候,会产生贪婪
[root@oldboyedu59 /oldboy]# grep '^.*o' oldboy.txt
I am oldboy teacher!
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldboyedu.com
not 4900000448.
my god ,i am not oldbey,but OLDBOY
god
[root@oldboyedu59 /oldboy]#
[]
[abc] 相当于1个字符,匹配到a或b或c
[root@oldboyedu59 /oldboy]# grep '[a-z]' oldboy.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldboyedu.com
my qq is 49000448
not 4900000448.
my god ,i am not oldbey,but OLDBOY
dfdfdkj343433#@#@#@#$%%%^%&^&&**()
god
gd
[root@oldboyedu59 /oldboy]#
[^]-----排除、取反
如:[^abc]------不要a或不要b或不要c
[root@oldboyedu59 /oldboy]# grep '[^abc]' oldboy.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldboyedu.com
my qq is 49000448
not 4900000448.
my god ,i am not oldbey,but OLDBOY
dfdfdkj343433#@#@#@#$%%%^%&^&&**()
god
gd
[root@oldboyedu59 /oldboy]#
2、扩展正则(Extended RE======ERE)※※※※※
使用命令egrep====grep -E
+
前1个字符连续出现1次或多次
[root@oldboyedu59 /oldboy]# egrep '0+' oldboy.txt
my qq is 49000448
not 4900000448.
[root@oldboyedu59 /oldboy]#
|
或者
[root@oldboyedu59 /oldboy]# egrep 'oldboy|oldbey' oldboy.txt
I am oldboy teacher!
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldboyedu.com
my god ,i am not oldbey,but OLDBOY!
()
被括起来的内容相当于是1个整体
sed 用来表示后向引用(反向引用)
[root@oldboyedu59 /oldboy]# egrep 'oldboy|oldbey' oldboy.txt
I am oldboy teacher!
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldboyedu.com
my god ,i am not oldbey,but OLDBOY!
[root@oldboyedu59 /oldboy]# egrep 'oldb(o|e)y' oldboy.txt
I am oldboy teacher!
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldboyedu.com
my god ,i am not oldbey,but OLDBOY!
{}
跟连续出现有关的:
*
+
b{m.n} 前个字符连续出现至少m次最多n次(>=m <=n)
b{m} 前一个字符连续出现m次(==m)
b{m,} 前1个字符连续至少出现m次(>=m)
b{,n} 前1个字符连续最多出现n次(<=n)
?
前1个字符出现0次或1次
[root@oldboyedu59 /oldboy]# egrep 'go?d' oldboy.txt
my god ,i am not oldbey,but OLDBOY
god
gd
[root@oldboyedu59 /oldboy]#
练习题:
显示以m或n或o开头的行
以m或n或点结尾的行
显示以m或n或o开头的 并且 以m或n或点结尾的行
#显示以m或n或o开头的行
[root@oldboyedu59 /oldboy]#
[root@oldboyedu59 /oldboy]# grep '^[mno]' oldboy.txt
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldboyedu.com
my qq is 49000448
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
#以m或n或点结尾的行
[root@oldboyedu59 /oldboy]#
[root@oldboyedu59 /oldboy]# grep '[mn.]$' oldboy.txt
I teach linux.
not 4900000448.
#显示以m或n或o开头的 并且 以m或n或点结尾的行
[root@oldboyedu59 /oldboy]# grep '^[mno].*[mn.]$' oldboy.txt
not 4900000448.
id.txt
金 211324198705244720
万 500224197105168312
任 1231231231oldboy
任 3oldboy
任 lidao97303136098
任 alex2197303136098
任 350182197303oldgir
吕 211282199209113038
孔 150000198309176071
邹 371001197412221284
贺 130185200011215926
杜 362522198711278101
向 14052219961008852X
取出文件中正确的身份证号码的行
[root@oldboyedu59 /oldboy]# egrep '[0-9X]{18}' id.txt
[root@oldboyedu59 /oldboy]# egrep '[0-9]{17}[0-9X]$' id.txt