Linux教程

day28linux正则表达式学习笔记

本文主要是介绍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.继续提取用户文件,来确定第一个单词的边界

 

 

正则记忆表

 

 

 

 

 

 

 

这篇关于day28linux正则表达式学习笔记的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!