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] 匹配括号内的小写a、b、c字符
[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默认不认识扩展正则{},识别不到它的特殊作用,因此只能用转义符,让他成为有意义的字符。
办法1 使用转义符 \{\} 办法2,让grep认识花括号,可以省去转义符 使用egrep命令 或者 grep -E
a\{n,\}
重复a字符至少n次,可以用简写了
a\{n\}
重复字符a,正好n次。
a\{,m\}
匹配字符a最多m次。
语法 + 重复前一个字符1次或多次 注意和*的区别,*是0次或多次
匹配一次或者多次0,没有0的行是不会显示的
找出一个、或者多个数字零
从文中找出连续的数字,排除字母,特殊符号、空格
找出连续的小写字母、排除大写字母、标点符号、数字
[^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!
竖线在正则里是或者的意思
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
找出系统中几个特殊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.继续提取用户文件,来确定第一个单词的边界