一、什么是正则表达式
在编写处理字符串的时候,经常需要查询某些符合复杂规则的字符串,正则表达式就是描述这些规则的工具。
正则表达式有基本表达式和扩展正则表达式。扩展正则表达式,是基本正则表达式的补充。有些元字符,稍有不同。
二、正则表达式的组成部分:
由元字符及正常字符所书写,元字符不表达字符本意,而表达控制或通配的功能;
2.1基本正则表达式/扩展正则表达式元字符
字符匹配:【基本/扩展正则表达式元字符相同】
基本/元字符: |
扩展/元字符: |
说明: |
. |
. |
匹配任意单个字符 |
[] |
[] |
匹配指定范围内的任意单个字符 |
[^] |
[^] |
匹配指定范围外的任意单个字符 |
一些常见的字符集: 数字 [0-9],[[:digit:]],[^0-9],[^[:digit:]] 小写字母 [a-z],[[:lower:]] 大写字母 [A-Z],[[:upper:]] 所有字母 [a-zA-Z],[[:alpha:]] 标点符号 [[:punct:]] 空白字符 [[:space:]] 字母与数字 [0-9a-zA-Z],[[:alnum:]] |
次数匹配:【省去特殊符号的脱字符】
基本/元字符: |
扩展/元字符: |
说明: |
* |
* |
匹配其前字符,0次或多次 |
\? |
? |
匹配其前字符,0次或1次 |
\+ |
+ |
匹配其前字符,1次或多次 |
\{m\} |
{m} |
匹配其前字符,精确匹配m次 |
\{m,n\} |
{m,n} |
匹配其前字符,至少m次,最多n次 |
基本/元字符: |
扩展/元字符: |
说明: |
.* |
.* |
匹配任意字符任意次 |
\{0,n\} |
{0,n} |
匹配其前字符,最多n次 |
\{m,\} |
{m,} |
匹配其前字符,至少m次 |
位置锚定:【基本/扩展正则表达式元字符相同】
基本/元字符: |
扩展/元字符: |
说明: |
^ |
^ |
锚定行首;用法:^字符串 |
$ |
$ |
锚定行尾;用法:字符串$ |
\< |
\< |
锚定词首,也可用\b |
\> |
\> |
锚定词尾,也可用\b |
^字符串$ |
^字符串$ |
用模式匹配整行 |
\<字符串\> |
\<字符串\> |
匹配字符串匹配到的整个单词 |
注意区别: ^$ 匹配空行 ^[[:space:]]*$ 有Tab或空格或无字符的行 |
分组\(\)【基本/扩展正则表达式元字符相同】
基本/元字符: |
扩展/元字符: |
说明: |
\(\) |
\(\) |
匹配词组,该词组可以被(内置变量,如\1,\2...)记忆 |
\1 |
\1 |
引用,由左至右,第一个左括号与之对应的右括号中的内容 |
分组\(\)与锚定\<\>一个词组,区别是:分组可以方便以后使用\1的引用 |
或者:
基本/元字符: |
扩展/元字符: |
说明: |
a|b |
a或者b 或者两侧所有内容 |
|
注意区别:abc|Cba 表示匹配abc或者Cda ab(c|C)ba 表示匹配abcba或者abCba |
一、如何使用正则表达式
通常,我们是通过文本搜索工具,以行为单位,全局搜索并显示正则表达式匹配的内容。其主要命令有:grep、egrep[grep -E]、fgrep
3.1基本正则表达式的使用
grep:
Global search REgular expression and Print out the line.全局搜索正则表达式和打印
grep用法:grep 选项 匹配模式 文件 |
选项:--color[=WHEN], --colour[=WHEN] auto、always、never -o: 只显示被模式匹配到的内容 -i: ignore case,不区分字符大小写 -v: 显示不能够被模式匹配到的行 -E:使用扩展的正则表达式 -A #: 显示行后#行 -B #: 显示行前#行 -C #: 显示行前行后#行 |
例一:#grep --color=auto "root" /etc/passwd
例二:#grep -o "root" /etc/passwd
例三:#grep --color=auto -A 1 “root” /etc/passwd
3.2扩展正则表达式使用
egrep用法:egrep 匹配模式 文件 |
选项:--color[=WHEN], --colour[=WHEN] auto、always、never -o: 只显示被模式匹配到的内容 -i: ignore case,不区分字符大小写 -v: 显示不能够被模式匹配到的行 -E:使用扩展的正则表达式 -A #: 显示行后#行 -B #: 显示行前#行 -C #: 显示行前行后#行 |
egrep等同于grep -E,使用扩展表达式元字符 |
四、练习使用正则表达式
4.1一般正则表达式练习
声明:为查看更清晰,采用命令别名定义grep显示颜色,截图省略部分行。
alias grep="grep --color=auto"
1、显示/proc/meminfo文件中以大写或小写S开头的行;用两种方式;
# grep "^[sS]" /proc/meminfo
# grep "^s" /proc/meminfo
2、显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;
思路:找shell为nologin的,采用-v参数取反,再截取用户名
# grep -v "/sbin/nologin$" /etc/passwd | cut -d: -f1
3、显示/etc/passwd文件中其默认shell为/bin/bash的用户;
# grep "/bin/bash$" /etc/passwd | cut -d: -f1
4、找出/etc/passwd文件中的一位数或两位数;
# grep "\<[0-9]\{1,2\}\>" /etc/passwd
5、显示/boot/grub/grub.conf中以至少一个空白字符开头的行;
# grep "^[[:space:]]\+" /boot/grub/grub.conf
6、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;
# grep "^#[[:space:]]\+[^[:space:]]\+" /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$" /etc/passwd
还可通过#cat /etc/passwd查看以下用户
4.2扩展正则表达式练习:
1、显示/proc/meminfo文件中以大写或小写S开头的行;用三种方式;
# egrep -i "^s" /proc/meminfo
# grep -E "^[sS]" /proc/meminfo
# grep -E "^(s|S)" /proc/meminfo
2、显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;
# egrep -v "/sbin/nologin$" /etc/passwd | cut -d: -f1
3、显示/etc/passwd文件中其默认shell为/bin/bash的用户;
# egrep "/bin/bash$" /etc/passwd | cut -d: -f1
4、找出/etc/passwd文件中的一位数或两位数;
# egrep --color=auto "\<[0-9]{1,2}\>" /etc/passwd
5、显示/boot/grub/grub.conf中以至少一个空白字符开头的行;
# egrep "^[[:space:]]+" /boot/grub/grub.conf
6、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;
# egrep "^#[[:space:]]+[^[:space:]]+" /etc/rc.d/rc.sysinit
7、打出netstat -tan命令执行结果中以‘LISTEN’,后或跟空白字符结尾的行;
# netstat -tan | egrep "LISTEN[[:space:]]*$"
8、添加用户bash, testbash, basher, nologin (此一个用户的shell为/sbin/nologin),而后找出当前系统上其用户名和默认shell相同的用户的信息;
# egrep "^([[:alnum:]]+\>).*\1$" /etc/passwd
9、显示当前系统上root、fedora或user1用户的默认shell;
# grep -E "^(root|fedora|user1)\>" /etc/passwd | cut -d: -f1,7
10、找出/etc/rc.d/init.d/functions文件中某单词后面跟一组小括号的行,形如:hello();
# grep -o -E "\<[[:alnum:]]+\>\(\)" /etc/rc.d/init.d/functions
11、使用echo命令输出一个绝对路径,使用grep取出其基名;
# echo /etc/rc.d/init.d/functions | grep -o -E "[[:alnum:]]+/?$" | cut -d/ -f1
扩展:取出其路径名
[[email protected] ~]# echo "/" |egrep -o --color=auto "^/|/.*[[:alnum:]]" | egrep -o "/|/.*[^[:alnum:]]"
12、找出ifconfig命令结果中的1-255之间数字;
# ifconfig | grep -E "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"
13、挑战题:写一个模式,能匹配合理的IP地址;
1.0.0.1 -- 239.255.255.255 注意()的位置
"\<[1-9]\>|\<[1-9][0-9]\>|\<1[0-9][0-9]\>|\<2[0-3][0-9]\>"1-239
"\<[0-9]\>|\<[1-9][0-9]\>|\<1[0-9][0-9]\>|\<2[0-4][0-9]\>|\<25[0-5]\>"0-255
#ifconfig |egrep --color=auto ‘(\<[1-9]\>|\<[1-9][0-9]\>|\<1[0-9][0-9]\>)\.(\<[0-9]\>|\<[1-9][0-9]\>|\<1[0-9][0-9]\>|\<2[0-4][0-9]\>|\<25[0-5]\>)\.(\<[0-9]\>|\<[1-9][0-9]\>|\<1[0-9][0-9]\>|\<2[0-4][0-9]\>|\<25[0-5]\>)\.(\<[0-9]\>|\<[1-9][0-9]\>|\<1[0-9][0-9]\>|\<2[0-4][0-9]\>|\<25[0-5]\>)‘