一、基本正则
常见元字符
元字符 | 说明 |
---|---|
^ | 以某个字符开头 |
$ | 以某个字符结尾 |
. | 匹配任意单字符 |
* | 对前一项进行0次或者多次重复匹配 |
{m,n} | 将前一项字符重复m-n次,{m,},{,n},{m,n} |
[] | 对方括号内的单字符进行匹配 |
[^] | 不匹配方括号内的单字符 |
^[] | 匹配以某个字符开头的行 |
() | 定义一个子表达式 |
词首【\<或\b】和词尾锚定【\>或者\b】 | 其后面的任意字符必须作为单词首部出现;其前面的任意字符必须作为单词尾部出现 |
\ | 转义字符,让一些特殊符号失效 |
二、POSIX字符类
-
POSIX字符类是一个形如
[:...:]
的特殊元序列(meta sequence),他可以用于匹配特定的字符范围
正则表达式 | 描述 | 示例 |
---|---|---|
[:alnum:] | 匹配任意一个字母或数字字符 | [[:alnum:]]+ |
[:alpha:] | 匹配任意一个字母字符(包括大小写字母) | [[:alpha:]] |
[:blank:] | 空格与制表符(横向和纵向) | [[:blank:]]* |
[:digit:] | 匹配任意一个数字字符 | [[:digit:]]? |
[:lower:] | 匹配小写字母 | [[:lower:]] |
[:upper:] | 匹配大写字母 | ([[:upper:]]+)? |
[:punct:] | 匹配标点符号 | [[:punct:]] |
[:space:] | 匹配一个包括换行符、回车等在内的所有空白符 | [[:space:]]+ |
[:graph:] | 匹配任何一个可以看得见的且可以打印的字符 | [[:graph:]] |
[:xdigit:] | 任何一个十六进制数(即:0-9,a-f,A-F) | [[:xdigit:]]+ |
[:cntrl:] | 任何一个控制字符(ASCII字符集中的前32个字符) | [[:cntrl:]] |
[:print:] | 任何一个可以打印的字符 | [[:print:]] |
三、扩展正则
元字符 | 说明 |
---|---|
? | 将前一项字符进行0次或者1次的重复匹配 |
+ | 将前一项进行1次或者多次的重复匹配 |
(|) | 匹配|符号左边或者右边的字符 |
习题:
1、显示/etc/login.defs文件中以不区分大小的h开头的行;
grep -i "^h" /etc/login.defs
2、显示/etc/passwd中以sh结尾的行;
grep sh$ /etc/passwd
3、显示/etc/fstab中以#开头,且后面跟一个或多个空白字符,而后又跟了任意非空白字符的行;
grep "^#[[:space:]]\{1,\}[^[:space:]]\{1,\}" /etc/fstab
grep -E "^# +[^ ]+" /etc/fstab
4、查找/etc/snmp/snmpd.conf中包含“以to开始并以to结尾”的字串行;
grep -n "to.*to" /etc/snmp/snmpd.conf
grep -n "\(to\).*\1" /etc/snmp/snmpd.conf
5、查找/etc/inittab中含有“以s开头,并以d结尾的单词”模式的行;
grep "\<s[a-Z]*d\>" /etc/services
6、查找ifconfig命令结果中的1-255之间的整数;
ifconfig | tr -s " " "\n" | grep -E "^([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"
7、显示/var/log/anaconda/journal.log文件中包含“Failed”或“FAILED”的行;
grep -i "Failed" /var/log/anaconda/journal.log
8、在/etc/passwd中取出默认shell为bash的行;
grep "/bash$" /etc/passwd
9、以长格式列出/etc/目录下以ns开头、.conf结尾的文件;
ls -l /etc/ns*.conf
10、高亮显示passwd文件中冒号,及其两侧的字符;
grep ".:." /etc/passwd