day14 正则表达式

第一章 正则表达式

1.什么是正则表达式

1.简单地说,正则表达式就是为处理大量的字符串及文本而定义的一套规则和方法。
2.正则表达式就是把人类想要查的东西,用计算机能识别的语言表达出来的一种规则。
3.正则表达式仅受三剑客(grep/egrep、sed、awk)命令支持,其他命令无法使用。

2.正则表达式和通配符区别

1.三剑客awk sed grep egrep使用的都是正则,其他都是通配符。
2.通配符是针对文件名,正则表达式是针对文件的内容
3.*?[]对于通配符来说都能代表任意字符
4.*?[]对于正则表达式来说只能代表这些符号前面的字符

3.什么是基本正则和扩展正则

linux三剑客的正则表达式可分为两类,具体如下。
1.基本正则表达式(BRE,basic regular expression)BRE对应的元字符有"^$.[]"。
2.扩展正则表达式(ERE,extend regular expression)ERE在BRE的基础上增加了"(){}?+|"等字符。

简单来说,就是扩展正则表达的符号更多,实现的功能更强大。

4.基本正则表达式常用符号

^       以什么开头,"^oldboy",表示匹配以oldboy单词开头的行
$       以什么结尾,"oldboy$",表示匹配以oldboy单词结尾的行
^$      组合符号,表示空行。逻辑解释就是以^开始,以$结尾的行
.       匹配任意且只有一个字符,但是不匹配空行。
       转义字符,让特殊符号失效,如"."只表示小数点
*       匹配前一个字符(连续出现)0次或1次以上,注意,当重复0次的时候,表示什么也没有,但是会撇清所有内容
.*      组合符,匹配所有内容
[abc]   匹配[]内包含的任意一个字符a或b或c
[a-z]   匹配[]内包含a-z任意一个字符包括大小写
[0-9]   匹配[]内包含0-9的任意一个数字
[^abc]  匹配不包含^后的任意字符a或b或c,这里的表示^对[abc]的取反,与在外面的^意义不同。

5.拓展正则表达式常用符号

+       匹配前一个字符1次或多次
[:/]+   匹配括号内的":"或"/"字符一次或多次
?       匹配前一个字符0次或1次
|       表示或者,即同时过滤多个字符串
()      分组过滤,被括起来的内容表示一个整体,另外()的内容可以被后面的
引用,n为数字,表示引用第几个括号的内容

      引用前面()里的内容,例如(abc)1表示匹配abcabc
a{n,m}  匹配前一个字符最少n次,最多m次
a{n,}   匹配前一个字符最少n次
a{n}    匹配前一个字符正好n次
a{,m}   匹配前一个字符最多m次

6.正则表达式练习

因为正则表达式的练习离不开三剑客命令,所有下面我们就使用grep命令来练习。

第2章 三剑客命令-grep

1.命令使用

专门用来过滤和搜索文本内容的命令,grep默认只支持基础正则表达式,使用-E参数,或者直接使用egrep命令就可以支持扩展正则了

常用选项:

-o     只显示匹配到的内容,默认会全部打出来
-w     精确匹配整个单词,默认是贪婪匹配
-n     显示所有匹配的内容的行号
-c     仅统计匹配内容的总行数
-A     After 匹配的内容的后多少行
-B     Before 匹配的内容的前多少行
-C     Context 匹配的内容前后多少行
-E     支持扩展正则
-i     忽略大小写
-f     可以讲匹配模式写进文件里,然后直接指定文件,根据文件里的匹配模式过滤
-color=auto  匹配上的内容高亮显示

2.基础正则表达式练习

2.1 创建测试文本

cat >oldboy.txt <<EOF
I am oldzhang!
I teach linux.
test

I like swimming,football,basketball,video games
I like ChaShao TaiQiu
my blog is https://www.cnblogs.com/alaska/
my site is https://www.jianshu.com/u/ee1c7fcea5b0
my-qq is 526195417
y_phone is 15321312624
EOF

2.2^查找以什么开头的行

[root@centos7-100 ~]# grep "^my" oldboy.txt 
my blog is https://www.cnblogs.com/alaska/
my site is https://www.jianshu.com/u/ee1c7fcea5b0
my-qq is 526195417

2.3$查找以什么结尾的行

[root@centos7-100 ~]# grep "s$" oldboy.txt
I like swimming,football,basketball,video games

2.4^$查找和排除空行

查找空行:
[root@centos7-100 ~]# grep -n "^$" oldboy.txt 
4:

排除空行:
[root@centos7-100 ~]# grep -vn "^$" oldboy.txt 
1:I am oldzhang!
2:I teach linux.
3:test
5:I like swimming,football,basketball,video games
6:I like ChaShao TaiQiu
7:my blog is https://www.cnblogs.com/alaska/
8:my site is https://www.jianshu.com/u/ee1c7fcea5b0
9:my-qq is 526195417
10:y_phone is 15321312624

2.5任意一个字符 不会匹配空行 包含空格

1.默认贪婪匹配,会匹配所有的内容

grep . oldboy.txt
[root@centos7-100 ~]# grep . oldboy.txt
I am oldzhang!
I teach linux.
test
I like swimming,football,basketball,video games
I like ChaShao TaiQiu
my blog is https://www.cnblogs.com/alaska/
my site is https://www.jianshu.com/u/ee1c7fcea5b0
my-qq is 526195417
y_phone is 15321312624

默认的贪婪匹配会把所有内容都匹配完后一起输出,如果我们想看每次一次的匹配内容可以使用-o参数

grep . oldboy.txt -o


[root@centos7-100 ~]# grep . oldboy.txt  -o
I
 
a
m
 
o
l
d
z
h
a
n
g
!
I
 
t
e
a
c
h
 
l
i
n
u
x
.
t
e
s
t
I

匹配一个任意字母的单词。默认会打印匹配到的行

grep "li.e" oldboy.txt

[root@centos7-100 ~]# grep "li.e" oldboy.txt 
I like swimming,football,basketball,video games
I like ChaShao TaiQiu

匹配多个任意字母的单词

grep "li.." oldboy.txt

[root@centos7-100 ~]# grep "li.." oldboy.txt 
I teach linux.
I like swimming,football,basketball,video games
I like ChaShao TaiQiu

2.6转义特殊字符

假如有需求:查找所有以.结尾的内容

如果不转义特殊字符的话,.这个符号会被认为是正则表达式

grep ".$" oldboy.txt

[root@centos7-100 ~]# grep ".$" oldboy.txt 
I am oldzhang!
I teach linux.
test
I like swimming,football,basketball,video games
I like ChaShao TaiQiu
my blog is https://www.cnblogs.com/alaska/
my site is https://www.jianshu.com/u/ee1c7fcea5b0
my-qq is 526195417
y_phone is 15321312624

正确命令:
grep ".$" oldboy.txt
[root@centos7-100 ~]# grep ".$" oldboy.txt
I teach linux.

2.7[]匹配包含abc任意字符串

grep "[abc]" oldboy.txt

[root@centos7-100 ~]# grep "[abc]" oldboy.txt 
I am oldzhang!
I teach linux.
I like swimming,football,basketball,video games
I like ChaShao TaiQiu
my blog is https://www.cnblogs.com/alaska/
my site is https://www.jianshu.com/u/ee1c7fcea5b0

2.8匹配[a-Z]任意字符


image-20211012134601025

image-20211012134701383

3.匹配0-9的字符串

grep "[0-9]" oldboy.txt

image-20211012135503950

4.[]匹配特殊字符,[]里大部分字符没有特殊含义,写什么就找什么,查找包含!和.的内容

image-20211012140208668

^在[]里面是以什么为开头的意思,而在[]外面就是取反的意思

排除以my开头的行

grep '^[^my]' oldboy.txt

image-20211012140737468

2.8 -i忽略大小写

默认大小写敏感

grep -wE'c[a-z]+' oldboy.txt

image-20211012141406249

使用-i参数忽略大小写

grep -Eiw 'c[a-z]+' oldboy.txt

image-20211012141639475

3.扩展正则练习

3.1{n}匹配前一个字符最多n次

匹配手机号而不是QQ号

grep -E '[0-9]{11}' oldboy.txt
image-20211012141901788

3.3{n,m}匹配前一个字符最少n次,最多m次

grep -E 'w{1,2}'  oldboy.txt

image-20211012142225339

3.4()分组引用

查找出所有单词中出现字母联系的行,比如www,http

grep -E '([a-z])1' oldboy.txt

image-20211012142817035

查找出同一个字母连续3次的行,比如www

grep -E '([a-z])1{2}' oldboy.txt
原文地址:https://www.cnblogs.com/zhaocheng690/p/15477146.html