通配符和正则的区别
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.继续提取用户文件,来确定第一个单词的边界
正则记忆表
原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/245174.html