内容预知
2.2.1 查看以xxx为开头 和查看以xxx为结尾的文件内容
1.正则表达式的介绍
1.1 正则表达式的组成
正则表达式是由普通字符与元字符组成:
-
普通字符 包括大小写字母、数字、标点符号及一些其他符号。
-
元字符 是指在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符或表达式)在目标对象中的出现模式。
1.2正则表达式和通配符的区别
通配符:在Linux中,一般配合find命令用于对文件目录,文件名的查找
正则表达式:匹配文件内容,用于精确筛选信息,可以配合grep,egrep,awk,sed命令进行搭配使用,查找时,也比通配符更加精确
2.基础正则表达式
适合awk,sed,grep,egrep等文本工具使用
元字符 | 作用 |
\ | 转义字符,用于取消特殊符号的含义 |
^ | 匹配字符串开始的位置 |
$ | 匹配字符串结束的位置 |
. | 匹配除\n之外的任意的单个字符 |
* | 匹配前面子表达式0次或者多次 |
[list] | 匹配list列表中的一个字符(列表中只要有一个符合即可) |
[^list] | 匹配任意非list列表中的一个字符 |
\ {n\ } | 匹配前面的子表达式n次 |
\ {n,\ } | 匹配前面的子表达式不少于n次 |
\ {n,m\ } | 匹配前面的子表达式n到m次(m必须大于n,不然会报错) |
注意:egrep、 awk使用{n}、{n,}、{n, m}匹配时 "{ }" 前不用加" \ "
2.1 转义字符的运用
2.1.1 将特殊含义的字符转换为普通字符的含义
被转义的特殊字符 | 转义前的含义作用 |
\ = | 具有赋值的作用,或则进行字符判断 |
\ ! | 有取反的作用(除了。。。。) |
\ & | 单个&符可以将命令挂在后台上,两个是逻辑符号且的作用 |
\ $ | 取值变量的作用 |
2.1.2 将普通字符转换为特殊作用的字符
被赋予新含义的普通字符 | 现在拥有的作用 |
\n | 拥有换行的作用 |
\t | 转化为制表符(能让输出结果呈现表格的格式) |
\w(小写) | 匹配包括下划线的任何单词字符 |
\W(大写) | 匹配任何非单词字符。等通于"[^A-Za-z0-9_]" |
\r | 转换后是回车符 |
\d | 匹配一个数字字符 |
\D | 匹配一个非数字字符。等价于[^0-9] |
\s(小写) | 空白符 |
\S(大写) | 非空白符 |
2.2 基础正则表达式实际应用
2.2.1 查看以xxx为开头 和查看以xxx为结尾的文件内容
[root@localhost tr]#grep '^1' math.txt
[root@localhost tr]#grep '3$' math.txt
2.2.2 匹配单个任意字符或者多个任意字符
[root@localhost tr]#grep 'g.d' english.txt
[root@localhost tr]#grep 'g.*d' english.txt
2.2.3 匹配列表内容和匹配非列表中的内容
[root@localhost tr]#head -n10 /etc/passwd |grep '[root]'
[root@localhost tr]#head -n10 /etc/passwd |grep '[^root]'
2.2.4 对子表达式进行多次或者限定次数的匹配
[root@localhost tr]#grep "go\{1\}" english.txt
[root@localhost tr]#egrep "go{2,}" english.txt
[root@localhost tr]#egrep "go{5,8}" english.txt
3.拓展正则表达式
3.1 拓展正则表达式的基本用法
支持awk和egrep使用,如果grep和sed想要正常使用(grep -E sed -r)
元字符 | 作用含义 |
+ | 匹配前面子表达式1次及以上 |
? | 匹配前面子表达式0次或者1次 |
() | 将括号中的字符串作为一个整体 |
| | 以"或"的方式匹配字符串 |
3.2 拓展正则表达式的实际运用
[root@localhost tr]#egrep 'go+d' english.txt
[root@localhost tr]#egrep 'go?d' english.txt
[root@localhost tr]#egrep '(good)' english.txt
[root@localhost tr]#egrep 'good|fgod' english.txt
4.正则表达式的组合筛查运用
4.1 按要求匹配输出规定的电话号码
匹配要求:
- 匹配 0512 开头的区号
- 区号与后面的号码以"-"或则空格或则没有
- 电话号码要5 或者 8开头的八位数。
[root@localhost zhengze]#egrep "^(0512)[- ]?[58][0-9]{7}$" phone.txt
4.2按照要求匹配出规定格式的邮箱
匹配要求:
1.用户名@的长度为6-18位,任意大小写的英文字母,任意数字,除了@和空格以外的任意符号,
开头只能是_或者英文字母
2.子域名(二级域):任意长度,符号只能使用"-"或者"_"或者"."
3. .顶级域:长度位2-5,任意大小写的英文
[root@localhost zhengze]#egrep '^[a-zA-Z][^@ ]{5,17}@[a-zA-Z0-9\-\._]+\.[A-Za-z]{2,5}$' email.txt
总结
1.grep和sed若想使用拓展正则表达式式,必须是(grep -E sed -r)
2.在正则表达式的组合匹配中,要注意匹配一些文本内容中的特殊字符时,先使用转义字符,将特殊字符变为普通字符