grep:(Global search REgular expression and Print out the line.)
grep是Linux的文本内容搜索工具,对于给定的文档,以行为单位,根据匹配条件对文本内容逐行匹配,匹配的条件小到单个字符大到整行,搜索时以指定的模式匹配字符串表达的内容为单位,这里提到的单位有字符串长度的意义,以这个字符串作为一个完整的单元从前至后匹配行中的内容,当在行中匹配到符合条件的内容后默认是将该行的予以显示,而不是匹配到的字符串,搜索时要求给定的搜索条件,即模式,也叫做正则表达式。
正则表达式:
正则表达式是一类字符所书写的模式,其中许多字符不表示其字面意义,而是表达控制或通配等功能,正则表达式就是字符与字符间的验证描述关系的展现。
grep的使用格式:
grep[options] ‘pattern‘ FILE ;从FILE文件中查找符合指定模式pattern的行并显示出来
例如:在/etc/passwd文件中查找包含root字符串的行
# grep ‘root‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
正则表达式主要分为两类:
基本正则表达式(grep),扩展正则表达式(egrep)
正则表达式的元字符:
具有特殊意义的专用字符,有通配的效果,不表示其字面意义,用于额外的功能性描述
一,基本正则表达式的元字符:
1、字符匹配元字符:
.:匹配任意单个字符,例如:查找/etc/passwd中以r开头中间跟任意两个字符的行,grep “r..t” /etc/passwd。
字符匹配元字符还有:
[]:匹配指定范围内的任意单个字符,常见的指定范围字符集能表达的字符有:
[0-9],[[:digit:]]数字;
[a-z],[[:lower:]]小写;
[A-Z],[[:upper:]]大写;
[[:space:]]空格;
[[:punct:]]标点;
[[:alpha:]]字母;
[[:alnum:]]字母+数字;
[^]:取反
2、次数匹配元字符:用于实现指定其前面的字符所能够出现的次数
*:任意长度,它前面的字符可以出现任意次,例如:grep “x*y” /tmp/test.txt。
注:示例中用的grep.txt文件中定义了若干行,内容是:Xxy,xyy,y,xy,y,ay,xxxxy,xyy每串字符是一行。
\?:0次或1次,它前面的字符是可有可无的,例如:grep “x\?y” /tmp/test.txt
\{m\}:m次,它前面的字符要出现m次,例如:grep “x\{2\}y” /tmp/test.txt
\{m,n\}:至少m次,至多n次,例如:grep “x\{2,5\}y” /tmp/test.txt
\{m,\}:至少m次,例如:grep “x\{3,\}y” /tmp/test.txt
\{0,n\}:至多n次,例如:grep “x\{0,2\}y” /tmp/test.txt
.*匹配任意长度的任意字符,例如,如查找/etc/passwd中以k开头后面跟任意字符的行
3、位置锚定元字符
^:行首锚定,例如查找/etc/passwd中以root为行首的行
$:行尾锚定,例如查找/etc/issue文件中以字母m结尾的行
^$:空白行,例如查找/etc/issue文件中的空白行
\<或\b:词首锚定,例如查找/etc/passwd中以root作为词首的行
\>或\b:词尾锚定,例如查找/etc/passwd中以root作为词尾的行
4、分组和引用元字符
\(\),例如:\(ab\)*
\#:引用元字符,引用第n个括号匹配到的内容
分组和引用元字符往往同时出现,例如:查找系统上其用户名和默认shell相同的用户
基本正则表达式中常用的选项:
--color=auto:自动选择颜色将内容高亮显示出来
-i:匹配时不区分大小写
-v:反向选取,只显示不符合模式的行;
-o:只显示被模式匹配到的字串,而不是整个行;
-A #:显示匹配到的行,同时显示其后面的#行
-B #:显示匹配到的行,同时显示其前面的#行
-C #:显示匹配到的行,同时显示其前后的#行
二,扩展正则表达式的元字符
扩展的正则表达式使用grep –E选项来表达使用扩展的正则表达式或者是使用egrep来表达,这两种表示法意义相同,使用扩展的正则表达式时用在原基本正则表达式元字符前的\转义字符就不再使用了,而当需要使用基本正则表达式中的元字符的原字符本意时,就需要用到扩展的正则表达式,而里面用到的特殊字符,如?、/、(、)等字符就需要转义,遇到这种情况是必须要用到扩展正则表达式来写模式匹配字符串的。
1、字符匹配元字符:这些元字符与基本正则表达式中的用法相同。
.:任意单个字符;
[]:字符集范围内的单个字符;
[^]:字符集范围外的单个字符
2、 次数匹配元字符:
*:匹配其前面字符任意次, 例如:grep -E “x*y” /tmp/test.txt
?:匹配其前面字符0次或1次,例如:grep -E “x?y” /tmp/test.txt
+:至少1次,例如查找/tmp/test.txt文件中x出现至少一次的行,grep -E "x+y" /tmp/test.txt
{m}:精确匹配m次,例如:grep -E “x{2}y” /tmp/test.txt
{m,n}:至少m次,至多n次,例如:grep -E “x{2,5}y” /tmp/test.txt
{m,}:匹配其前面的字符至少m次,例如:grep -E “x{3,}y” /tmp/test.txt
{0,n}:匹配其前面的字符至多n次,例如:grep -E “x{0,2}y” /tmp/test.txt
3、位置锚定元字符:位置锚定元字符在pattern表达式中的写法与基本正则表达式的相同
^:行首锚定
$:行尾锚定
\<,\b:词首锚定
\>,\b:词尾锚定
^$,^[[:space:]]*$:空白行
4、分组和引用:
( ):分组
引用:\#
分组示例:查找/proc/meminfo文件中以S或s开头的行,grep –E “^(s|S)” /proc/meminfo
引用示例:查找系统上其用户名和默认shell相同的用户
正则表达式写法的自我经验总结:
1、 1、 首先要考虑表达式字符串所在行的位置,比如行首,行尾,或者词首和词尾或某些字符的前后等,很多时候要搜索的字符串位置会比较隐晦的表达出来,但是我们在实际的搜索过程中要其自身的位置特点,甚至是观察其周围字符的特点和位置将其表达出来,否则表达式的内容表达的内容就不完整或缺少内容或所要的字符串并不能符合要求。
2、 2、其次要考虑的是字串的字符内容,是什么类型的字符,要匹配的字符要能完整的表达所要匹配的完整字符串,其中的字母数字特殊字符都要完整表达出来。
3、 3 、考虑字符出现的的次数,往往查找字符串都是匹配前面的字符,有很多时候匹配字符串的长度要求会隐讳的表达出来,如中间跟任意字符,或某类字符有多个等等,次数的匹配也是正则表达式字串完整意义重要的一环,也是表达式书写完整充分的关键。
grep工具的使用及正则表达式的说明至此结束。
grep工具的使用与正则表达式