正则表达式:Regual Expression,REGEXP


由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或通配的功能。

分两类:

    基本正则表达式:BRE

    扩展正则表达式:ERE


grep:Global  search REgular expression and print out the line

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

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


正则表达式引擎:


grep [options] pattern [file]

grep [options]  -e pattern  [-f  file]  [file...]


-i   :忽略字符大小写

-o   :仅显示匹配到的字符串本身

-v   :显示不能够被匹配到的行

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

-w   :整行匹配某个单词 (一行就一个单词可重复)

-q   :静默模式,不输出任何消息

-r   :递归查找每个目录

-c   :统计行数

-e   :指定字符串作为查找文件内容的范本样式

-A # :after 后#行

-B # :before前#行

-C # :context前后各#行

-n   :匹配到的行加行号


基本正则表达式元字符:

字符匹配:

.     :任意单个字符

[]    :匹配指定范围的任意单个字符

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


匹配次数:

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

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

.*   :匹配任意长度的任意字符

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

\+   :匹配其前面字符1次或多次

\{m\}:匹配前面的字符m次

\{m,n\}:匹配其前面的字符至少m次,至多n次

\{0,n\}:至多n次  小于等于n

\{m,\}:至少m次  大于等于m


位置锚定:

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

$    :行尾锚定

^...$:匹配整行

^$   :空白行             ^[[:space:]]$ 包含空白字符的行

\<或\b:词首锚定

\>或\b:词尾锚定

\<PATTERN\>:锚定完整单词


分组及引用:

\(\)  转义符加括号,将多个字符捆绑在一起,当做整体处理

分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为:

\1:第一组括号  (从左面数的第一个括号)

\2:第二组括号

例:

  grep "\(l..e\).*\1" love.txt



egrep:

支持扩展的正则表达式实现类似于grep文本过滤功能,-G支持一般正则表达式

egrep [OPTIONS]  PATTERN  [FILE...]


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

.     :任意单个字符

[]    :匹配指定范围的任意单个字符

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


匹配次数:

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

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

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

+   :匹配其前面字符1次或多次

{m}:匹配前面的字符m次

{m,n}:匹配其前面的字符至少m次,至多n次

{0,n}:至多n次  小于等于n

{m,}:至少m次  大于等于m


位置锚定:

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

$    :行尾锚定

\<或\b:词首锚定

\>或\b:词尾锚定


分组及引用,同grep


或者:

a|b   cat|C   表示整个左侧或者整个右侧



练习:


找出/proc/meminfo文件中,所有以大写或小写s开头的行,至少三种方式:

grep -i "^s" /proc/meminfo

grep "^[sS]" /proc/meminfo

grep -E "^(s|S)" /proc/meminfo


显示当前系统上roo、centos或者user用户的相关信息

grep -E "^(root/centos/user)\>" /etc/passwd


找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行

grep -E -o "[_[:alnum:]]+\(\)" /etc/rc.d/init.d/functions


使用echo命令输出一绝对路径,使用egrep取出基名

echo /etc/sysconfig/ | grep -E -o "[^/]+/?$"


找出ifconfig命令结果中1-255之间的数值

ifconfig | grep -E -o "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"


找出ifconfig命令结果中所有IPv4地址

ifconfig | grep -E -o "(\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>\.)(\<([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>\.){2}\<([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"


找出/etc/passwd文件中用户名同shell名的行

grep -E "^([^:]+\>).*\1$" /etc/passwd


找出ifconfig eth0 的ip地址

ifconfig eth0 | grep "inet addr" | cut -d: -f 2|cut -d " " -f 1