写在前面:如果此文有幸被某位朋友看见并发现有错的地方,希望批评指正。如有不明白的地方,愿可一起探讨。
什么是正则表达式?
见名知意,正则表达式也就是符合某种规则的表达式,它是由特殊字符和其他字符组成的字符串。要想以正则表达式的规则来处理字符串,就得需要使用支持正则表达式的工具程序(有时也被称为正则表达式引擎)才行,例如grep,egrep,vi,sed,awk等,用来从/boot/grub/grub.conf文件中提取结果的命令如下图所示。
基础正则表达式之工具程序grep
元字符
●字符匹配元字符
.: 匹配任意单个字符
[]: 匹配指定范围内的任意单个字符
[0-9],[[:digit:]]: 代表数字0-9
[a-z],[[:lower:]]: 代表小写字母a-z
[A-Z],[[:upper:]]: 代表大写字母A-Z
[[:space:]]: 任何会产生空白的字符,包括空格键[Tab] CR等
[[:punct:]]: 代表标点符号
[[:alpha:]]: 代表任何英文大小写字符
[[:alnum:]]: 代表英文大小写字符及数字
[^]: 字符集合的反向选择
●次数匹配元字符
*: 任意长度,它前面的那一个字符重复零次到无穷多次
\?: 0次或一次,它前面的那一个字符可有可无
\{m\}: 它前面的那个字符要出现m次
\{m,n\}: 它前面的那个字符至少出现m次,最多出现n次
\{0,n\}: 它前面的那个字符至多出现n次
.*: 零个或多个任意字符
小贴士:以上的反斜杠‘\’为字符转义
位置锚定
^: 行首锚定,写在正则表达式最左侧
$: 行尾锚定,写在正则表达式最右侧
^$: 空白行
\<: 词首锚定,出现于单词左侧,等价于\b
\>: 词尾锚定,出现于单词右侧,等价于\b
小贴士:此处单词的意思为不代表特殊字符的连续字符串
分组
\(\)
分组中的模式匹配到的内容,可由正则表达式引擎记忆在内存中,之后可以引用
引用:
例如:\(ab\(x\)y\).*\(mn\)
有编号:自左而右的左括号,以及与其匹配的右括号
\#: 引用第n个括号所匹配到的内容,而非模式本身
例如:\(ab\(x\)y\).*\(mn\)\1
\1: 表示与下划线相同部分内容
工具程序grep使用方法
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
常用option:
-v: 反向选取
-o: 紧显示匹配的字符串,而非字符串所在的行
-i: ignore-case,忽略字符大小写
-E: 支持使用扩展正则表达式,也即grep -E 等价于 egrep
-n: 顺便输出行号
-A #: 除了列出该行外,后续#行也列出来
-B #: 除了列出该行外,前面#行也列出来
-C #: 除了列出该行外,前面#行和后面#行也都列出来
练习:
平台:CentOS release 6.5
1、显示/proc/meminfo文件中以大写或小写S开头的行;
# grep -i '^s' /proc/meminfo
# grep '^[Ss]' /proc/meminfo
2、显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;
# grep -v "/sbin/nologin$" /etc/passwd | cut -d : -f 1
3、显示/etc/passwd文件中其默认shell为/bin/bash的用户;进一步:仅显示上述结果中其ID号最大的用户;
# grep "/bin/bash$" /etc/passwd | sort -t: -k 3 -n | tail -1 | cut -d: -f 1
4、找出/etc/passwd文件中的一位数或两位数;
# grep "\<[0-9][0-9]\?\>" /etc/passwd
# grep "\<[0-9]\{1,2\}\>" /etc/passwd
5、显示/boot/grub/grub.conf中以至少一个空白字符开头的行;
# grep "^[[:space:]]\{1,\}" /boot/grub/grub.conf
6、显示/etc/rc.d/rc.sysinit文件中,以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;
# grep "^#[[:space:]]\{1,\}[^[:space:]]\{1,\}" /etc/rc.d/rc.sysinit
7、找出netstat -tan命令执行结果中以'LISTEN'结尾的行;
# netstat -tan | grep "LISTEN[[:space:]]*$"
8、添加用户bash,testbash,basher,nologin(SHELL为/sbin/nologin),而找出当前系统上其用户名和默认shell相同的用户;
# grep "^\([[:alnum:]]\{1,\}\):.*\1$" /etc/passwd
扩展正则表达式之工具程序egrep
说明:扩展正则表达式的元字符也就是在基础正则表达式的元字符的基础上多几个元字符,并且基础正则表达式中的次数匹配元字符和分组括号( )需要转义的,在扩展正则表达式中无需转义。
所增加的常见元字符
+: 重复一次或一次以上前一个字符
|: 用或(or)的方式找出数个字符串
例如:gd|good|god: 表示找出gd或good或god这三个字符串。
工具程序egrep使用方法
egrep等价于grep -E
练习:
平台:CentOS release 6.5
9、显示当前系统上root、fedora或user1用户的默认shell;
# grep -E "^(root|fedora|user1):" /etc/passwd | cut -d : -f 7
10、找出/etc/rc.d/init.d/functions文件中某单词后跟一组小括号“()”行;
# grep -o -E "\<[[:alnum:]]+\>\(\)" /etc/rc.d/init.d/functions
11、使用echo命令输出一个路径,而后使用grep取出其基名;
# echo "/etc/sysconfig/" | grep -o -E "[^/]+/?$" | cut -d / -f 1
12、找出ifconfig命令结果中的1-255之间的数字;
# ifconfig | grep -o -E "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"
13、挑战题:写一个模式,能匹配合理的ipv4地址,匹配的地址范围为(0.0.0.0-255.255.255.255);
#ifconfig | grep -E "\<((2[0-4][0-9]|25[0-5]|[01]?[0-9][0-9]?)\.){3}(2[0-4][0-9]|25[0-5]|[01]?[0-9][0-9]?)\>"
推荐由作者:deerchao 所写的正则表达式30分钟入门教程链接:http://www.jb51.net/tools/zhengze.html#introduction