今天,我们来学习一下正则表达式。
正则表达式
1,什么是正则表达式
正则表达式,即 Regual Expression 简写为 REGEXP;是由一类特殊字符及文本字符所编写的模式。其中有些字符并不表示其字面意义,而是用于表示控制或通配的功能,这些字符称为元字符。
2,正则表达式的类型
正则表达式分为:
- 基本正则表达式
- 扩展正则表达式
3,元字符
(1)字符匹配
. : 匹配任意单个字符
[ ] : 匹配指定范围内的任意单个字符
[^] : 匹配指定范围外的任意单个字符
各种范围表示如下:
[:digit:] : 任意一个数字
[:lower:] : 任意一个小写字母
[:upper:] : 任意一个大写字母
[:alpha:] : 任意一个字母
[:alnum:] : 任意一个数字或字母
[:punct:] : 任意一个标点符号
[:space:] : 一个空白字符
(2) 匹配次数
用在要指定其出现的次数的字符后面;用于限制其前面字符的出现的次数,默认为贪婪模式;
* : 匹配其前面的字符任意次;0次,1次或多次;
. * : 匹配任意长度的任意字符;
? : 匹配其前面的字符0次或1次,即前面的字符是可有可无的;
+ : 匹配其前面的字符1次或多次,即前面的字符至少出现1次;
{m} : 匹配其前面的字符m次;
{m,n} : 匹配其前面的字符至少m次,至多n次;
{0,n} : 匹配其前面的字符至多n次;
{m,} : 匹配其前面的字符至少m次;
(3) 位置锚定
^ : 行首锚定,用于模式的最左侧;
$ : 行尾锚定,用于模式的最右侧;
^PATTERN$ : 用PATTERN匹配整行
^$ : 匹配空白行;
1$ : 显示空白行或者只含有空白字符的行;
(4)单词锚定
非特殊字符组成的连续字符(字符串)都成为单词;
< 或 \b : 词首锚定,用于单词模式的左侧;
> 或 \b : 词尾锚定,用于单词模式的右侧;
< PATTERN > : 匹配完整单词;
(5)分组及引用
\( \) : 将一个或多个字符捆绑在一起,当做一个整体进行处理;
后向引用:引用前面的分组括号中的模式所匹配到的字符。
此用法将“分组括号内的模式匹配到的内容”被正则表达式引擎自动记录于内部的变量中,这些变量分别为:
\1 : 从左侧起,第一对括号之间的模式匹配到的字符(串);
\2 : 从左侧起,第二对括号之间的模式匹配到的字符(串);
并以此类推…
示例:首先我们创建文本文件lovers.txt,其内容为:
He loves his lover
He likes his lover
He likes her liker
He loves her liker
我们要匹配到一个字符串以l开头以e结尾,并且在之后匹配一个与前面匹配完全相同的字符串。
[root@localhost jeffrey]# grep "\(l..e\).*\1" lovers.txt
He loves his lover
She likes her liker
#####现在,我们来见识一下linux文本处理三剑客之一:grep
grep : Glob search REgular expression and Print out the line
**功能:**文本搜索工具,根据用户指定的模式(过滤条件),对目标文本逐行进行匹配检查,并打印出匹配到的行;
**模式:**由正则表达式的元字符及文本字符所编写的过滤条件;
**原理:**正则表达式引擎;
用法:
# grep [options] PATTERN [FILE…]
# grep [options] [-e PATTERN | -f FILE] [FILE…]
选项:
–color=auto 对匹配到的文本着色后高亮处理
-i 忽略字符大小写(ignonrecase)
-o 仅显示匹配到的字符串本身;
-v, - - invert-match 反向显示,即显示没有被匹配到的行;
-E 支持使用扩展的正则表达式元字符;
-q, - - quiet, - - silent 静默模式,即不输出任何信息;
-A # (after)显示匹配行及其之后的#行;
-B # (before)显示匹配行及其之前的#行;
-C # (context)显示匹配行及其前后各#行;
实践是检验真理的唯一标准,我们动手练习一下吧!
1,显示/etc/passwd文件中不易/bin/bash结尾的行。
[root@localhost /]# grep -v "/bin/bash$" /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
......
2,找出/etc/passwd文件中的两位数或三位数。
[root@localhost /]# grep "\<[0-9][1-9][1-9]\>" /etc/passwd
.....
pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
gnome-initial-setup:x:989:984::/run/gnome-initial-setup/:/sbin/nologin
jeffrey:x:1000:1000:jeffrey,Security,911,9111:/home/jeffrey:/bin/bash
3,找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中,以至少一个空白字符开头,且后面非空白字符的行。
[root@localhost /]# grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg
load_env
set default="${next_entry}"
set next_entry=
save_env next_entry
set boot_once=true
set default="${saved_entry}"
.....
4,找出“netstat -tan”命令的结果中以“LISTEN”后跟0,1或多个空白行字符结尾的行。
[jeffrey@localhost ~]$ netstat -tan | grep "LISTEN[[:space:]]*$"
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp6 0 0 :::111 :::* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 ::1:631 :::* LISTEN
tcp6 0 0 ::1:25 :::* LISTEN
[:space:] ↩︎