一、什么是正则表达式
简单地说,正则表达式就是处理字符串的方法,它是以行为单位进行字符串的处理行为,正则表达式通过一些特殊符号的辅助,可以让用户轻易达到查找、删除、替换某特定字符串的处理程序。
正则表达式基本上是一种“表示法”,只要工具程序支持这种表示法,那么该工具程序就可以用来作为正则表达式的字符串处理之用。例如:vi,grep,awk,sed
正则表达式的字符串表达方式依照不同的严谨度而分为基础正则表达式与扩展表达式,扩展表达式除了简单的一组字符串处理外,还可以做组的字符串处理。
二、特殊字符
1、正则表达式的字符匹配
. 匹配任意单个字符
[] 指定范围内的的任意单个字符 例如[ab]即a或者b
常用的实例:[0-9],[[:digit:]]
[a-z],[[:lower:]]
[A-Z],[[:upper:]]
等等其他特殊字符
[^] 指定范围外的任意单个字符
2、次数匹配(用来匹配其前面的字符的次数)
* 任意次
例如:x*y 包含:y,xy,xxy,xxxy等等 贪婪模式:尽可能长的去匹配字符
.* 匹配任意长度的任意字符
\? 0次或1次
例如:x\?y 包含:xy,y
\{m\} 匹配m次
\{m,n\} 匹配只是m次,至多n次
\{m,\} 至少m次
\{,n\} 至多n次
3、位置锚定(用于字符出现的出现的位置)
^ 锚定行首
$ 锚定行尾
^$ 空白行
\< 锚定词首 \> 锚定词尾
例如:\<abcd\> 只能匹配abcd
4、分组
\(\) 例如:\(ab\)*xy 匹配任意个ab字符串,如:abxy xy ababxy等
5、引用
\1 引用前面的第一个左括号以及其对应的右括号中所匹配的内容
\2 引用前面的第二个左括号以及其对应的右括号中所匹配的内容
\3......
例如:\(ab\)xy\1 为abxyab
四、正则表达式工具grep
grep 常用选项
-v:反向,显示不能被模式匹配到的行;
-o:仅显示被模式匹配到的字符串,而非整行
-i:不区分大小写
-E:支持扩展正则表达式
-A: 不但显示所匹配到的行,还显示后面的N行(-A 后面跟数字)
-B:不但显示所匹配到的行,还显示前面的N行
-C:不但显示所匹配到的行,还显示上下问的各N行
五、实例练习
1、显示/etc/passwd 文件中大小写r开头的行
grep --color=auto "^[Rr]" /etc/passwd 或者grep --color=auto -i "^[r]" /etc/passwd
2、取出默认shell为非bash的用户
grep --color=auto -v "bash$" /etc/passwd | cut -d: -f1
3、取出默认shell为bash,且用户ID最大的用户
grep --color=auto "bash$" /etc/passwd | sort -n -t: -k3|tail -1|cut -d: -f1
4、显示/etc/rc.d/rc.local文件中,以#开头,后面至少跟一个空白字符,而后至少有一个非空白字符行
grep --color=auto "^#[[:space:]]\{1,\}[^[:space:]]\{1,\}" /etc/rc.d/rc.local