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\}'