grep及正则表达式

来源:互联网 发布:知乎手机版怎么收藏 编辑:程序博客网 时间:2024/06/14 01:59

grep及正则表达式(文本查找)

grep的英文全称:Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用特定模式PATTERN(包括正则表达式)去匹配搜索文本,并将符合模式文本行显示到屏幕。grep家族包括grep、egrep和fgrep。

用法定义

 grep [OPTIONS] PATTERN [FILE...]

PATTERN:由文本和正则表达式的元字符组合而成的匹配条件

OPTIONS

-i  忽略大小写

--color或--colour 将匹配文本以颜色显示 alias grep='grep --colour'


-v 显示没有被模式匹配的行(被匹配的行不显示,不被匹配的行反而显示)


-o 只显示被模式匹配到的字符串本身,每一个字符串显示为一行


传统元字符

* 任意长度的任何字符

任意单个字符

[] 指定范围内的

[^] 指定范围外的

正则表达式:Regular Expression,由元字符组成,但意义有所区别。

正则表达式中的元字符:

点表示匹配任意单个字符


表字符匹配个数/次数的元字符:

*表示匹配前面的字符任意次

如test文件的字符为a,b,ab,aab,acb,adb,amnb

a*b *这里不是指任意长度的任意字符,而是指匹配其前面的字符a任意次(0次也行,代表a不出现),但后面必须是b

(用途:搜索后面字符必须为b,但b前面的字符为a的任意长度(0代表可以没有a)的字符。换句话说,查看多少含有b的字符串,且满足前面含有a或者没有a出现的这种字符串的数量。)


a.*b  .表示任意字符,*表示这个任意字符出现任意次(用途:a开头,b结束,中间可以是任意字符。)

.*表示任意长度的任意字符


注意:对于“amnbmnbmnb”也在结果之中。体现正则表达式的一种工作贪婪或者完备机制,尽可能长的匹配出所有符合要求的结果。

\?要配合转义字符使用)匹配其前面的字符1次或0次(可选-?前面字符可有可没有,关键?后面的字符一定得有。--典型的grep部分匹配,grep功用--要弄清楚能匹配到哪些部分,且明白显示输出是整行)。

a?b 只要出现b的地方都符合要求,a可以紧挨着出现或者不挨着或者干脆没有a出现都可行。


\{m,n\}匹配其前面的字符(也可以是元字符中的)至少m次,最多n次。--用于次数匹配

注意:这里一定要加反斜线(因为bash shell中反斜线为命令行展开,这里加反斜线的目的其意思告诉命令行不要展开,这个{}就被grep理解为特定的用途)

\{1,\} 匹配其前面的字符至少一次,最多不限制。

\{0,3\} 匹配其前面的字符可以不匹配,但匹配最多三次。


删除添加的两行,恢复如初。再看下面的表达式有何不同

不难看出,符号“.”可代表任意单个字符,多少和a没有直接关系,只要以a开头以b结束,其中的任意字符可以是1-3个之间的任意数。


位置确定

^确定行首位置:此字符后面的任意内容必须出现在行首


$ 确定行尾位置:此字符前面的任意内容必须出现在行尾



^$  显示是否有空白行


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

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

字符集合,使用是必须再用[]将其括起来,对应含义如下:

[:digit:] 数字

[:lower:] 小写字母

[:upper:] 大写字母

[:punct:] 标点符号

[:space:] 空白字符

[:alpha:] 所有字母

[:alnum:] 所有数字

如:新建一个临时文件inittab2,然后显示以数字结尾的行。


显示以一个或多个空白字符加数字结尾的行


\<或\b确定词首:其后面的任意字符必须作为单词首部出现

\>或\b确定词尾:前面的任意字符必须作为单词部出现

\<root\>精确匹配某个单词


分组:

\(\)

\(ab\)* ab可以出现1次,0次或任意次 ;*作用不是b本身,而是ab整体。

如:找该文件中出现ab的行和没有出现ab的行。


该分组是为了后面的引用提供一个参考。

后向引用:前面匹配什么,后面引用什么,看最后两行,便于理解。

\1: 引用第一个左括号与与之对应的右括号所包含的所有内容。


搜索0-9中以任意数字开头,然后以相同的数字结尾的所有行。


分析/etc/inittab文件中如下文本中前两行的特征(比如第2,3,4个数字相同)写出可以精确查找到类似两行的的模式:

111:wait:/etc/rc.d/rc 1
122:wait:/etc/rc.d/rc 2


知识点:

正则表达式(大多数文本处理工具都支持):

Basic Regular Expression 基本正则表达式

基本正则表达式(知识点):

字符匹配:

. 任意单个字符

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

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

次数匹配:

* 其前的字符0次,1次或多次 ;即任意次

\? 其前的字符0次,或1次;即可有可无

\{m,n\} 匹配其前的字符,至少m次,至多n次(如无上限,n可以省略;如果最少是0次,m必须写成0,不得省略)


.* 任意长度的任意字符

锚定:

^ 锚定行首

$ 锚定行尾

\<,\b 锚定单词首部

\>,\b 锚定单词尾部

分组:

\(\)

\1,\2,\3,...

grep:使用基本正则表达式定义的模式来过滤文本的命令:

-i

-v

-o

--color

-E

-A # 匹配到,后面的#行也显示(After)

-B # 匹配到,前面的#行也显示(Before)

-C # 匹配到,前后的#行也显示(Context)



Extended Regular Expression 扩展正则表达式

(egrep=grep -E)

字符匹配(其含义与grep一样)

[]

[^]

次数匹配(部分与grep不同)

*    与grep相同

?  与grep含义相同,但无需加反斜线

+    匹配其前字符至少一次 (相当于基本正则表达式grep中的\{1,\})

{m,n} 与grep含义相同,但无需加反斜线

位置锚定(与grep一样)

^

$

\<

\>

分组

()    分组,但无需反斜线

\1,\2,\3,...

或者

|    相当于or


搜索以至少一个空白字符开头的行


找出文件中/boot/grub/grub.conf中1-255中的整数

思路:加括号,使用或(图中后者正确,思考加括号区别)有括号:首尾进行或(中间的不计算)

前者:只要是数字,都给搜出来,之所以358被搜出来,其实358是1位后者2位被搜出来的

后者:使用了锚定,这就使用用于单词的确定查找法,只不过这其中的单词是必须是全数字-且符合范围,使用的数字被当作单个单词出现。其中el6就被当作一个单词,但是不是数字。


找出文件中ifconfig中1-255中的整数


找出文件中ifconfig中满足1-255中的地址(ABCDE)

一般写法:


优化写法:


找出文件中ifconfig中满足1-255中的有效的IP地址(ABC)


fgrep:fast grep(不支持正则表达式,所以执行快)


原创粉丝点击