grep (global search regular RE ) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Unix的grep家族包括grep、egrep和fgrep

egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。

grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容。

grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。


^行起始标记^tux匹配以tux起始的行
$行尾标记tux$匹配以tux结尾的行


.


匹配任意一个(单个)字符

Hack.匹配Hackl和Hacki,但是不能匹配Hackl2和Hackil,它只能匹配单个字符
[]匹配包含在[字符]之中的任意一个字符coo[kl]匹配cook或cool
[^]
匹配除[^字符]之外的任意一个字符9[^01]匹配92、93,但是不匹配91或90
[-]匹配[]中指定范围内的任意一个字符[1-5]匹配从1~5的任意一个数字
?匹配之前紧挨的项1次或0次colou?r匹配color或colour,但是不能匹配colouur
+
匹配之前的项1次或多次Rollno-9+匹配Rollno-99,Rollno-9,但是不能匹配Rollno-
*
匹配紧挨在其前面字符任意次co*l匹配cl、col、coool等
()创建一个用于匹配的子串ma(tri)?匹配max或maxtrix
.*匹配任意长度的任意字符r.*h 匹配rabch、ra4udh、erivhil
\{m,n\}匹配其前面的字符至少m次,至多n次a\{1,3\}b 匹配ab,aab,aaab
\{0,n\}匹配其前面的字符至多n次,0-n次a\{0,3\}b 匹配ab,aab,b,aaab
\{m,\}匹配其前面的字符至少m次a\{3,\}b 匹配aaab,aaaab
\<锚定词首\<[bB].{\2,5\}[tT]\>
\>
锚定词尾
\(\)分组\(ab\)\{1,3\};匹配ab,abab,ababab

POSIX字符类

正则表达式描述示例
[:alnum:]字母与数字字符[[:alnum:]]+
[:alpha:]字母字符(包括大写字母与小写字母)[[:alpha:]]{4}
[:blank:]空格与制表符[[:blank:]]*
[:digital:]数字字符[[:digital:]]?
[:lower:]
小写字母[[:lower:]]{5,}
[:upper:]
大写字母([[:upper:]]+)?
[:punct:]
标点符号[[:punct:]]
[:space:]包括换行符、回车等在内的所有空白字符[[:space:]]+

选项

--color=auto 匹配到的行显示红色:

export GREP_COLOR='01;36'

-v:反向选取,只显示不符合模式的行:

-o:只显示被模式匹配的字符串,而不是整个行:

-A #:显示匹配到的行时,顺带其后面的#个行:

-B #:显示匹配到的行时,顺带其前面的#个行:

-i:匹配是不区分字母大小写:

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

-r:递归搜索:


扩展正则表达式与正则表达式不同地方:

在做次数匹配和分组,把\取消

egrrep --color "a+b" grep.txt

b之前必须出现至少1个a


综合练习:

1、找出某文件中哦哦那个的,1位数,或2位数;

grep "\<[0-9]\{1.2\}\>"

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

ifconfig |grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'