计算机的世界里,有一组很奇特的字符串,它可以在搜索和替换操作中,提供要查找的确切内容。并在动态和静态文本中,都能表示。这也就是传说中的正则表达式。因其广泛的应用性,所以在各个语言和各种工具中都有使用,相对于各类应用而言,它就是最基本的材料。所以下面我们就来了解下正则表达式的意义。
正则表达式:
定义:是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。
功用:通常被用来检索或替换那些符合某个模式的文本内容。
分类:基本正则表达式,扩展正则表达式。
正则表达式分类:
基本型:
字符匹配
. 匹配任意单个字符
[] 匹配指定范围内的任意单个字符
[0-9],[[:digit:]]所有数字
[a-z],[[:lower:]]所有小写字母
[A-Z],[[:upper:]]所有大写字母
[[:space:]] 空格
[[:punct:]] 所有标点符号
[[:alpha:]] 所有字母
[[:alnum:]] 所有字母和数字
[^] 取反
次数匹配前面字符匹配
* 任意长度,任意次
\? 0次或1次
\{m\}精确m次
\{m,n\}最少m次,最多n次
\{m,\}最少m次
\{0,n\}最多n次
.*:任意长度的任意字符
位置锚定
^: 行首锚定
$: 行尾锚定
^$:空白行
\<:词首
\>:词尾
分组引用
\(\):分组
\#: 引用
扩展型:
字符匹配
.: 匹配任意单个字符
[]: 匹配指定范围内的任意单个字符
[0-9],[[:digit:]]所有数字
[a-z],[[:lower:]]所有小写字母
[A-Z],[[:upper:]]所有大写字母
[[:space:]] 空格
[[:punct:]] 所有标点符号
[[:alpha:]] 所有字母
[[:alnum:]] 所有字母和数字
[^]: 取反
次数匹配 前面字符匹配
*: 任意长度,任意次
?: 0次或1次
+: 至少1次
{m}:精确m次
{m,n}:最少m次,最多n次
{m,}:最少m次
{0,n}:最多n次
位置锚定
^:行首锚定
$:行尾锚定
^$:空白行
\<:词首
\>:词尾
分组引用
():分组
\#:引用
或者
#|n:#或者n
说完了基本的材料正则表达式,我们就该说包裹在它外层的应用工具了。所以我们这里就介绍下一个基本的常规工具grep。
grep:
定义:grep是一种文本搜索工具,它的全称是:Global search REgular expression and Print out the line.,即全局搜索正则表达式并把行打印出来。PS:因为它支持正则表达式,所以可以做为正则表达式外置的工具来使用。当然它还有它额外的命令选项来对正则语句进行微调。
功用:它是在文本中,把符合规则的那部分内容显示并打印出来。
语法格式:
grep [option]... ‘PATTERN‘ FILE...
option:选项,内可以填充命令选项
PATTERN:模式,内可以填充正则语句
命令选项:
-v:反向选取
-o:仅显示匹配的字串,而非字串所在的行
-i:忽略字符大小写
-E:支持使用正则表达式
-A#:显示之后的几行字串
-B#:显示之前的几行字串
-C#:显示前后的几行字串
补充:grep家族中包括了grep,egrep和fgrep工具。egrep是grep的扩展,支持更多元字符的扩展正则表达式。而fgrep则是fixed grep或fast grep,它不再支持正则表达式,仅仅是把所有的字母都看做单词。
示例:
前置命令:
alias grep=“grep --color=auto”//命名别名,将gerep定义为符合规则的内容自动添加颜色。
grep的常用选项:
-v:反向,显示不能被模式匹配到的行;
例:检索文件/etc/passwd中非#的行。
grep -v "#" /etc/passwd
-o:仅显示被模式匹配到的字串,而非整行;
例:检索/etc/passwd文件中hadoop用户的行。
-i:不区分字符大小写;
例:检索/etc/fstab中包含u中间跟两个任意字符,最后一个字符为d的行,不区分大小写;
-E:支持扩展的正则表达式(加-E可以使用grep启用egrep的功能 grep -E)
例:检索/etc/inittab中包含a或b的行;
-A #:显示之后的几行字符
例:检索/etc/passwd包含root及后3行内容;
-B #:显示之前的几行字符
例:检索/etc/passwd包含hadoop及前3行内容;
-C #:显示前后的几行字符
例:检索/etc/passwd中包含shutdown的前后3行内容
-n:显示匹配行及行号
例:显示/etc/passwd中包含root的行及行号;
grep的模式(PATTERN):
字符匹配:
.:任意单个字符
例:在/etc/passwd文件中检索包含r后面两个字符,然后是t的行;
grep "r..t" /etc/passwd
[]:指定范围内的任意单个字符
例:在/etc/passwd中搜索以S或s后面接任意一个字符,之后是s的行;
grep "[sS].s" /etc/passwd
[0-9]:匹配任何一个数字
例:在/etc/passwd中搜索user后跟任意一个字符的行;
[[:alnum:]]:匹配任何一个字母或数字
[[:alpha:]]:匹配任何一个字母
[[:lower:]]:匹配任何一个小写字母
[[:upper:]]:匹配任何一个大写字母
[[:space:]]:任何一个空白字符
[[:punct:]]:任何一个标点符号
[^]:指定范围外的任意单个字符
例:在/etc/selinux/config下非标点符号开始的行;
grep "^[^[:punct:]].*" /etc/selinux/config
位置锚定:
^:锚定行首
例:锚定/etc/fstab下,行首到空格之前的内容;
$:锚定行尾
例:检索/etc/passwd含有bash的行尾;
^$:空白行
例:统计/etc/fstab里的空白行数;
\<:锚定词首
例:锚定以r为词首的内容
\>:锚定词尾
例:锚定以t为词尾的内容
次数匹配:
*:任意次(0次或多次)
.*:匹配任意长度的任意字符
\{m\}:匹配m次
\{m,\}:至少m次
\{0,n\}:至多n次
分组:
\(\)
引用:
\#
扩展正则表达式与基本正则表达式基本类似,也就格式稍有不同,并多了一个|符号。再此就不一一详述了。鄙人才疏学浅刚刚接触linux,如有错误和语述不详之处,尽请谅解!
此文章借鉴参考了jinlinger的《文本检索秘技之正则表达式grep和egrep》
原文出处: http://essun.blog.51cto.com/721033/1361920
正则与grep