第六章 正则表达式
1,正则表达式概念
1,正则表达式(re),又称规则表达式。用来处理字符串的方法,以行为单位进行字符串的处理,通过一些特殊字符,让用户完成查询,删除,替换等目的。
2,在大多数程序里,RE都被置于两个正斜杠之间,例如/I[oO]ve/。
3,RE通常缩写成regex,单数有regexp,regex;复数有regexps,regexes,regexen。
2,正则表达式元字符
1,RE由普通字符和元字符组成。
- 普通字符:包含大小写字母和数字。
- 元字符:具有特殊含义。
2,元字符通常由各种执行模式匹配操作的程序来解析
3,正则表达式语法
RE是由普通字符(a~z)及特殊字符(称为元字符)组成的文字模式。
RE可以是单个字符,字符集合,字符范围,字符间的选择等任意组合
4,正则表达式运算符优先级
RE从左到右进行计算。相同优先级的RE从左到右运算,不同优先级的RE运算先高右低
5,正则表达式匹配规则
基本模式匹配
**模式是RE最基本的元素。**它是一组描述字符串特征的字符组成的字符集,用于匹配字符串。
\n:换行
\r:回车
\t:制表符
\f:换页
字符簇
用连字符可以表示一个字符的范围。
[a-z] #匹配所有 的小写字母
[A-Z] #匹配所有的大写字母
[a-zA-Z] #匹配所有的字母
[0-9] #匹配所有的数字
#^匹配开头(当在方括号里表示非);$匹配结尾
^[^0-9][0-9]$ #第一个字符不能是数字
[^a-z] #除字母外的所有字符
[^$] #空行
#花括号的三种用法:
(1){x}:前面的字符只出现x次。
(2){x,}:前面的内容出现x或多次。
(3){x,y}:前面的内容至少出现x次,但不超过y次。
^[a-zA-Z0-9_ ]{1, }$ #所有包含一个以上的字母,数字或下画线的字符串
^[1-9][0-9]{0, }$ #所有的正整数
^\-{0,1} [0-9]{1, }$ #所有的整数
^[ - ]?[0-9]+\.?[0-9]+$或^\-?[0-9]{1, }\.?[0-9]{1, }$ #所有的浮点数
6,grep命令
grep命令简介
grep命令是一种强大的文本搜索工具,是Linux文本处理工具中的三剑客之一。
通常grep有三个版本:grep、fgrep,egrep。
grep命令语法格式
#语法格式:
grep [options] pattern [filename]
找到匹配的表达式: grep返回的退出状态为0
没找到匹配的表达式: grep返回的退出状态为1
找不到指定文件: grep返回的退出状态为2
grep命令,可以来自标准输入或管道
grep命令使用方式
-q,-v,-R(-r),-A,-B,-C,-o
针对“--color” 选项,在.bashrc 或者.bash profile 文件中加入alias grep=grep -color- auto,生效后,grep的搜索结果自动高亮匹配。
针对“搜索字符串”选项,使用正则表达式时必须用单引号'括起来,避免与Shell的元字符冲突。结合grep 与正则表达式,能快速准确地找到希望匹配的字符串和行,提高工作效率。
grep命令结合正则表达式使用
其中,“\1”、“2”、$是后向引用,引用前面的分组括号中的模式所匹配的字符。在某行文本的检查中,如果使用“()”, 则分组括号中的模式匹配的某内容可以被引用。扩展正则表达式与正则表达式略有不同。
grep命令结合正则表达式案例实战
1,#使用egerp匹配文件中root字符串
[root@localhost ~]# egrep 'root' /etc/passwd /etc/shadow /etc/hosts
/etc/passwd:root:x:0:0:root:/root:/bin/bash
/etc/passwd:operator:x:11:0:operator:/root:/sbin/nologin
/etc/shadow:root:$6$YwwVMLULtamj9HkA$abG.jwCmQWMr.W9rWibB6y6WGfuVKM/BDdtCoc6OhKnfgHRLvGfeXnA37BILKUIlKMIplJyRd7W6X1jQIzCP.0::0:99999:7:::
2,#使用egrep列出匹配行的文件名
[root@localhost ~]# egrep -l 'root' /etc/passwd /etc/shadow /etc/hosts
/etc/passwd
/etc/shadow
3,#在每一行之前加上该行在文件中的相对行号
/etc/passwd:1:root:x:0:0:root:/root:/bin/bash
/etc/passwd:10:operator:x:11:0:operator:/root:/sbin/nologin
/etc/shadow:1:root:$6$YwwVMLULtamj9HkA$abG.jwCmQWMr.W9rWibB6y6WGfuVKM/BDdtCoc6OhKnfgHRLvGfeXnA37BILKUIlKMIplJyRd7W6X1jQIzCP.0::0:99999:7:::
4,#使用egrep匹配IP地址
[root@localhost ~]# egrep '([0-9](1,3)\.){3}[0-9]{1,3}'
5,#找出/etc/rc.d/init.d/functions文件中行首为某单词(包含下划线)后面跟一个小括号的行
[root@localhost ~]# cat /etc/rc.d/init.d/functions | grep -Eo "^[a-zA-Z]*_*.*\(\)"
6,#列出/etc命令下所有以.conf结尾的文件名,并将其名字转换为大写后保存至/tmp/etc.conf文件中
[root@localhost ~]# find /etc/ -name '*.conf' | grep -Eo "[^/]*(\.conf)$" |tr 'a-z' 'A-Z' >/tmp/etc.conf
7,#显示/proc/meminfo文件中以大小s开头的行
[root@localhost ~]# cat /proc/meminfo |grep "^[sS]"
8,#显示/etc/passwd文件中不以/bin/bash结尾的行。
[root@localhost ~]# cat /etc/passwd |grep -v "/bin/bash$"
9,#找出“netstat -tan”,命令的结果中以“LISTEN"后跟任意多个空白字符结尾的行。
[root@localhost ~]# netstat -tan |grep "LISTEN[[:space:]].*"
10,#显示CentOS 7上所有系统用户的用户名和UID。
[root@localhost ~]# cat /etc/passwd|cut -d ":" -f1,3|grep -v "root"|grep -v "[0-9]\{4,\}"
11,#取出文件/ete/inittab文件中,以#开头,且后面跟一个空格的行。
[root@localhost ~]# grep "^#[[:space:]]" /etc/inittab
12,#使用egrep取出/etc/rc.d/init.d/functions中其基名。
[root@localhost ~]# echo /etc/rc.d/init.d/functions |grep -o "\b[[:alnum:]]+/*$"
13,#取出grep选项-R。
[root@localhost ~]# grep --help|grep "\-R"