正则表达式:Regular Expression, REGEX

分两类:

基本正则表达式:BRE 

扩展正则表达式:ERE

grep家族:

grep: Global search REgular expression and Print out the line. 支持使用基本正则表达式;

egrep:支持使用扩展正则表达式;

fgrep:不支持使用正则表达式;

grep命令:

作用:文本搜索工具,根据用户指定的”pattern(过滤条件)“对目标文本逐行进行匹配检查;打印出符合条件的行;

模式:由文本字符及正则表达式元字符所编写的过滤条件;

常用选项:

--color=auto:对匹配到的文本着色后高亮显示;

-i:忽略字符大小写;

-o:仅显示匹配 到的文本自身;

-v, --invert-match:反向匹配;

-E:支持扩展的正则表达式;

-q, --quiet, --silient:静默模式,不输出任何信息;

基本正则表达式元字符:

字符匹配:

.:匹配任意单个字符;

[ ]:匹配范围内的任意单个字符;

[^ ]:匹配范围外的任意单个字符;

[:digit:],[:lower:], [:upper:], [:alpha:], [:alnum:], [:space:], [:blank:], [:punct:]

man 7 glob

匹配次数:

用在要指定其出现的次数的字符后面,用限制其前面的字符要出现的次数;默认工作于贪婪模式;

*:匹配前面的字符任意次(0,1或多次);

grep "x*y":

xxxyabc

yabc

abcxy

abcy

.*:任意长度的任意字符;

\+:匹配前面的字符至少1次;

grep "x\+y":

xxxyabc

yabc

abcxy

abcy

\?:匹配前面的0次或1次,即前面的字符可有可无;

grep "x\?y":

xxxyabc

yabc

abcxy

abcy

\{m\}:其前面的字符出现m次,m为非负整数;

grep "x\{2\}y":

xxxyabc

yabc

abcxy

abcy

\{m,n\}:其前面的字符出现m次,m为非负整数;[m,n]

\{0,n\}:至多n次;

\{m,\}:至少m次;

位置锚定

限制使用模式搜索文本,限制模式所匹配到的文本只能出现于目标文本的哪个位置;

^:行首锚定;用于模式的最左侧,^PATTERN

$:行尾锚定;用于模式的最右侧,PATTERN$

^PATTERN$:要让PATTERN完全匹配一整行;

^$:空行;

^[[:space:]]*$:

单词:由非特殊字符组成的连续字符(字符串)都称为单词;


\<或\b:词首锚定,用于单词模式的左侧,格式为\<PATTERN, \bPATTERN

\>或\b:词尾锚定,用于单词模式的右侧,格式为PATTERN\>, PATTERN\b

\<PATTERN\>:单词锚定;

实例:

1、显示/etc/passwd文件中不以bash结尾的行;

~]# grep -v "bash$" /etc/passwd

2、找出/etc/passwd文件中的三位或四位数;

~]# grep "\<[0-9]\{3,4\}\>" /etc/passwd

3、找出/etc/grub2.cfg文件中,以至少一个空白字符开头,后面又跟了非空白字符的行;

~]# grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg

4、找出"netstat  -tan”命令的结果中,以‘LISTEN’后跟0或多个空白字符结尾的行;

~]# netstat -tan | grep "LISTEN[[:space:]]*$"

5、找出"fdisk  -l“命令的结果中,包含以/dev/后跟sd或hd及一个小字母的行;

~]# fdisk -l | grep "/dev/[sh]d[a-z]\>"

6、找出”ldd  /usr/bin/cat“命令的结果中文件路径;

~]# ldd /usr/bin/cat | grep -o "/[^[:space:]]\+"

分组与引用:

\(PATTERN\):将此PATTERN匹配到的字符当作一个不可侵害整体进行处理;

Note:分组括号中的模式匹配到的字符会被正则表达式引擎自动记录于内部的变量中,这些变量是\1, \2, \3, ...

pat1\(pat2\)pat3\(pat4\(pat5\)pat6\)

\n:模式中第n个左括号以及与之匹配的右括号之间的模式所匹配到的字符串;(不是模式,而是模式匹配的结果)

\1:第一组括号中的pattern匹配到的字符串;

\2:第二组括号中的pattern匹配到的字符串;

……

He love his lover.

He like his lover.

He love his liker.

He like his liker.

l..e.*l..er

\(l..e\).*\1r

后向引用:引用前面的括号中的模式所匹配到的字符串;

常用选项之二:

-E, --extended-regexp:支持使用扩展正则表达式

-F, --fixed-strings:支持使用固定字符串,不支持正则表达式,相当于fgrep;

-G, --basic-regexp:支持使用基本正则表达式;

-P, --perl-regexp:支持使用pcre正则表达式;

-e PATTERN, --regexp=PATTERN:多模式机制;

-f FILE, --file=FILE:FILE为每行包含了一个pattern的文本文件,即grep script;

-A NUM, --after-context=NUM

-B NUM, --before-context=NUM

-C NUM, -NUM, --context=NUM

egrep:

支持使用扩展正则表达式的grep命令,相当于grep -E;

egrep [OPTIONS] PATTERN [FILE...]

扩展正则表达式的元字符:

字符匹配:

.:任意单个字符

[ ]:范围内的任意单个字符

[^ ]:范围外的任意单个字符

匹配次数:

*:任意次;

?:0次或1次;

+:1次或多次;

{m}:匹配m次;

{m,n}:至少m次,至多n次;

{0,n}

{m,}

位置锚定:

^:行首

$:行尾

\<, \b:词首

\>, \b:词尾

分组及引用:

(pattern):分组,括号中的模式匹配到的字符会被记录于正则表达式引擎内部的变量中;

后向引用:\1, \2, ...

或者:

a|b:a或者b

C|cat:表示C或cat

(C|c)at:表示Cat或cat

实例:

1、显示/etc/passwd文件中不以bash结尾的行;

~]# egrep -v "bash$" /etc/passwd

2、找出/etc/passwd文件中的三位或四位数;

~]# egrep "\<[0-9]{3,4}\>" /etc/passwd

3、找出/etc/grub2.cfg文件中,以至少一个空白字符开头,后面又跟了非空白字符的行;

4、找出"netstat  -tan”命令的结果中,以‘LISTEN’后跟0或多个空白字符结尾的行;

5、找出"fdisk  -l“命令的结果中,包含以/dev/后跟sd或hd及一个小字母的行;

6、找出”ldd  /usr/bin/cat“命令的结果中文件路径;

7、找出/proc/meminfo文件中,所有以大写或小写s开头的行;至少用三种方式实现;

~]# egrep "^(s|S)" /tmp/meminfo

~]# grep "^[sS]" /tmp/meminfo

~]# grep -i "^s" /tmp/meminfo

8、显示当前系统上root、centos或slackware用户的相关信息;

~]# egrep "^(root|centos|slackware)\>" /etc/passwd

9、echo输出一个绝对路径,使用egrep取出其基名;

~]# echo /etc/passwd/ | egrep -o "[^/]+/?$"

10、找出ifconfig命令结果中的1-255之间的整数;

~]# ifconfig | egrep "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"

11、添加用户bash、testbash、basher及nologin,要求前三个用户的默认shell为/bin/bash,nologin的默认shell为/sbin/nologin,而后找出其用户名与shell名相同的用户;

~]# egrep "^([[a-z0-9]+)\>.*\1$" /etc/passwd