day28linux正则表达式学习笔记

通配符和正则的区别

1.从语法上就记住,只有awk、gre、sed才识别正则表达式符号、其他都是通配符

2.从用法上区分

  • 表达式操作的是文件、目录名(属于是通配符)
  • 表达式操作的是文件内容(正则表达式)

基本正则表达式

测试文本数据

[root@yuchao-tx-server test]# cat chaoge666.txt I am teacher yuchao. I teach linux,python!  I like english  My website is http://yuchaoit.cn Our school site is https://apecome.com My qq num is 877348180  Good good study , day day up!

关于单引号、双引号

  • 正则的模式,建议使用双引号
  • 如果未涉及变量等,用单引号也不影响

^ 尖角符

语法 写于最左侧,如 ^my 逐行匹配,找到以my开头的内容

 

 

 

 

$ 美元符

语法  word$ 匹配以word结尾的行

 

 

^$ 匹配空行

找出文件的空行

 

 

. 点符

 . 匹配除了换行符以外所有的内容、字符+空格,除了换行符。

 

. 点处理空格、换行

. 可以匹配到空格,以及任意字符

但是点,不匹配换行符。

 

 

 

 .代表任意一个字符

.$ 匹配任意字符结尾

 

 

 

. 和转义符

只想拿到每一行结尾的普通小数点 .,需要对点转义

 

 

 

 

\ 转义符

转义字符,让有特殊意义的字符,现出原形,还原其本义。

* 星号

重复前一个字符0此或n次

 

 

 

.* 符

匹配任意字符

.表示任意一个字符,*表示匹配前一个字符0次或多次  因此放一起,代表匹配每一行所有内容,包括空格  注意 . 点不匹配换行 

 

 

 

^.* 符

语法 ^.* 表示以任意多个字符开头的行

.*$ 符

以任意多个字符结尾的行

 

[ ] 中括号

中括号,有如下用法

[abc]

[abc] 匹配括号内的小写a、b、c字符

 

 

 

[a-z]、 [A-Z] 、[a-zA-z]、[0-9]

[a-z]                匹配所有小写单个字母 [A-Z]                匹配所有单个大写字母 [a-zA-Z]        匹配所有的单个大小写字母 [0-9]                匹配所有单个数字 [a-zA-Z0-9]    匹配所有数字和字母

[a-z] 匹配小写字母

 

 

 [A-Z] 匹配大写字母

 

 

 [a-z0-9A-Z] 匹配大写、小写字母、数字

 

 

 [^]取反

语法  [^abc] 排除中括号里的a、b、c ,和单独的^符号,作用是不同的  [^a-z] 排除小写字母

{ } 花括号(扩展正则)

a\{n,m\}

a\{n,m\} 重复字符a,n到m次  a\{1,3\} 重复字符a,1到3次

正则

8\{1,3\} 匹配数字8一次到3次

 

  

 

 

 

grep 默认不认识扩展正则 {}

grep默认不认识扩展正则{},识别不到它的特殊作用,因此只能用转义符,让他成为有意义的字符。

办法1 使用转义符 \{\}  办法2,让grep认识花括号,可以省去转义符 使用egrep命令 或者 grep -E

a\{n,\}

重复a字符至少n次,可以用简写了

 

 

 

a\{n\}

重复字符a,正好n次。

 

 

 

a\{,m\}

匹配字符a最多m次。

 

 

 

+ 加号

语法  +  重复前一个字符1次或多次 注意和*的区别,*是0次或多次

匹配一次或者多次0,没有0的行是不会显示的

0+

找出一个、或者多个数字零

 

 

 

 

[0-9]+

从文中找出连续的数字,排除字母,特殊符号、空格

 

 

 

[a-z]+

找出连续的小写字母、排除大写字母、标点符号、数字

 

 

 

[^A-Za-z0-9]+]

此写法,找出除了数字、大小写字母以外的内容,如空格、标点符号。

你可以使用-o参数,看到每次匹配的内容。

 

 

 

*和+的区别

语法 *是重复0次、重复多次,因此没匹配到的行也过滤出来了  +是重复1次、多次、因此至少匹配到1次才看到

 

 

 

go*d和go+d和go?d区别

准备测试数据

I am God, I need you to good good study and day day up, otherwise I will send you to see Gd,oh sorry, gooooooooood!

 

 

 

| 或者符

竖线在正则里是或者的意思

查看文件系统inode和block信息

dumpe2fs /dev/sdc |grep -Ei '^(inode|block)' 
 

( ) 括号、分组符

语法 () 作用是将一个或者多个字符捆绑在一起,当做一个整体进行处理  小括号功能之一是分组过滤被括起来的内容,括号内的内容表示一个整体  括号()内的内容可以被后面的\n正则引用,n为数字,表示引用第几个括号的内容  \1:表示从左侧起,第一个括号中的模式所匹配到的字符 \2:从左侧起,第二个括号中的模式所匹配到的字符

分组基本用法

测试数据 [root@yuchao-tx-server test]# cat god.log I am God, I need you to good good study and day day up, otherwise I will send you to see Gd,oh sorry, gooooooooood! I am glad to see you, god,you are a good god!

要求仅仅匹配出glad和good

尝试使用正则 grep -iE gla|ood god.log

并非我们想要的数据 我想要的是例如这样的匹配,只找出good、glad grep -iE glad|good god.log

可以使用分组写法

grep -iE g(la|oo)d god.log

分组与向后引用

语法 ()       分组过滤,被括起来的内容表示一个整体,另外()的内容可以被后面的\n引用,n为数字,表示引用第几个括号的内容  \n       引用前面()里的内容,例如(abc)\1 表示匹配abcabc

 

 

提取/etc/passwd

找出系统中几个特殊shell、专门用来开机,关机的用户 特点是、用户名、登录shell名字一样 可以用分区提取出

分组正则,提取特殊用户

这部分正则需要拆开,更容易理解 1.提取冒号以外的字符,使用+可以匹配更多字母,没必要每次只处理一个 grep -Ei [^:]+ /etc/passwd  2. 使用\b匹配单词边界,提取出单词,示例用法,通常英文单词的边界是空格,标点符号 [root@yuchao-tx-server test]# echo  'my name is chao,everyone call me chaoge' | grep -Ei chao\b -o chao  3.继续提取用户文件,来确定第一个单词的边界

 

 

正则记忆表