16-正则表达式

image.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<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

你可能感兴趣的:(16-正则表达式)