1.什么是grep
grep(Golobal Regular Expression print)是Linux系统中一个强大的文本搜索工具,也是俗称的搜索三兄弟之一,grep的最大意义就是搜索文本,把匹配的行打印到屏幕上,但不影响原文件的内容;在搜索文本的过程中,可以利用到“正则表达式”来定以自己的搜索匹配模式。
Unix的grep家族包括了grep、egrep、fgrep三个,接下来的内容也会围绕着grep来进行展开;
2.grep家族的简单用法
2.1常用用法
grep的常用用法很简单,通常使用如下的格式:
grep [OPTIONS] PATTERN [FILES];
PATTERN也就是搜索模式,是grep进行文本搜索过滤的条件,通常由正常字符及正则表达式的字符组成;
相对于grep而言,egrep = grep -E 可以使用基本的正则表达外, 还可以用扩展表达式;fgrep=grep –F, 但是fgrep与grep及egrep有一些明显的区别,fgrep并不使用正则表达式,而会将PATTERN解释为一般的字符来进行查找,从而fgrep在搜索不需要使用正则表达式的情况下速度是最快的;
2.2常见参数
Options |
解释 |
-o |
只显示被模式匹配到的内容 |
-i |
搜索时不区分字符大小写 |
-v |
显示不能够被模式匹配到的行 |
-E |
使用扩展的正则表达式,相当于使用egrep |
-F |
将范本样式视为固定字符串的列表,相当于fgrep |
-c |
只显示匹配行的数量 |
-n |
在输出前加上上匹配行的行号 |
–color= |
auto, always, never |
-A # |
显示被模式匹配到的行及后#行 |
-B # |
显示被模式匹配到的行及前#行 |
-c # |
显示被模式匹配到的行及其前后各#行 |
3.详解grep的搜索
3.1通配符
在搞搞grep的搜索用法,也就是使用正则表达式之前,我觉得自己还是很有必要来重新过一遍Linux中shell的通配符,来作为学习正则表达式之前的热身和比较;目前最常用的文件通配符包括*、?、[],具体如下:
解释 |
示例 |
|
* |
任意长度的任意字符,零个或多个; |
heah*,以head为首的任意长度的字符 *tail,以tail为结尾的任意长度的字符 |
? |
任意单个字符,可使用多次 |
y?u,?表示中间有且只亦一个字符 |
[] |
匹配[]内任意单个字符 |
[0-9][abd] |
[^] |
不匹配[]内的任何字符 |
[^0-9]匹配0-9之外的任意字符 |
注:这些字符都有这特殊含义,而要想使用其的一般含义,需加上转义符”\”进行转义;
3.2正则表达式
想想还是觉得c一段正则的解释放在这里比较好,不然我自己都说不出个所以然来。正则表达式(REGular Expression);简称REGEXP,是由元字符及正常字符所书写的模式,其中有元字符不表示字符本身的意义,而是用于表达控制或通配等功能;而常用的正则表达式则分为了基础正则表达式、扩展正则表达式,为了方便自己记忆,还是觉得整个丑的表格比较下:
偷懒这里就按照马哥教的来排个序;基础和正则表达式最大的区别也就是在使用上,例如grep –E或者egrep才可以使用扩展正则表达式,以后在使用的过程中,也必须要了解命令是否支持扩展的正则表达式先;
类型 |
元字符 |
意义 |
|
基础篇 |
扩展篇 |
||
字符匹配 |
. |
. |
匹配任意单个字符,相当于通配符?; |
[] |
[] |
匹配指定范围内的任意单个字符; |
|
[^] |
[^] |
匹配指定范围外的任意单个字符; |
|
一些常用特殊的字符匹配,通用 |
|||
[0-9] = [[:digit:]] = \d = [123456789] |
匹配数字 |
||
[a-z] = [[:lower:]] |
匹配单个小写字母 |
||
[A-Z] = [[:upper:]] |
匹配单个大写字母 |
||
[0-9a-zA-Z] = [[:alnum:]] |
匹配单子字母或数字 |
||
[a-zA-Z] = [[:alpha:]] |
匹配单个字母,不区分大小写 |
||
[[:space:]] = \s |
匹配空白字符 |
||
[[:punct:]] |
匹配单个标点符号 |
||
\w |
匹配字母或数字或下划线或汉字 |
||
注:可使用[^]表示范围外,[^[]] |
类型 |
元字符 |
意义 |
|
基础篇 |
扩展篇 |
||
次数匹配 (在期望匹配字符的后面提供一个控制符号,用于表达匹配前面的字符指定的次数) |
* |
* |
匹配*前面的单个字符任意次,可以为0次; |
.* |
.* |
匹配任意长度的任意字符; |
|
\? |
? |
匹配?前面的字符0或者1次; |
|
\+ |
+ |
匹配+前面的字符至少1次; |
|
\{m,n\} |
{m,n} |
匹配其左侧的字符至少m次,至多n次; |
|
\{m,\} |
{m,} |
匹配其左侧的字符至少m次,无上限; |
|
\{0,n\} |
{0,n} |
匹配其左侧的字符至多n次; |
|
\{m\} |
{m} |
精确匹配其左侧的字符m次; |
|
类型 |
元字符 |
意义 |
|
基础篇 |
扩展篇 |
||
位置锚定 |
^ |
^ |
锚定行首,^PATTERN; |
$ |
$ |
锚定行尾,PATTERN$; |
|
^PATTERN$ |
^PATTERN$ |
用模式匹配整行内容; |
|
^$ |
^$ |
^[[:space:]]$,匹配空白行; |
|
类型 |
元字符 |
意义 |
|
基础篇 |
扩展篇 |
||
单词锚定 |
\< |
\< |
锚定词首,\<PATTERN = \bPATTERN; |
\> |
\> |
锚定词尾, PATTERN\> = PATTERN\b |
|
\<PATTERN\> |
\<PATTERN\> |
匹配PATTERN能匹配到的整个单词; |
|
\b |
\b |
匹配一个字边界,即字与空格间的位置; |
|
类型 |
元字符 |
意义 |
|
基础篇 |
扩展篇 |
||
分组及引用 |
\(\) |
() |
将()中字符集合到一起作为一个字符引用; |
\# |
\# |
引用,模式中自左而右, |
|
分组中的模式,在某次的具体匹配过程中所匹配的字符,可以被grep记忆(保存在内置的变量中,这些变量是\1, \2,…),因此,还可以被引用; |
还是要注:这些字符都有这特殊含义,而要想使用其的一般含义,需加上转义符”\”进行转义;
摘一段正则表达式的贪婪与非贪婪模式:
1.什么是正则表达式的贪婪与非贪婪匹配
如:String str="abcaxc";
Patter p="ab*c";
贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。如上面使用模式p匹配字符串str,结果就是匹配到:abcaxc(ab*c)。
非贪婪匹配:就是匹配到结果就好,就少的匹配字符。如上面使用模式p匹配字符串str,结果就是匹配到:abc(ab*c)。
默认是贪婪模式;在量词后面直接加上一个问号?就是非贪婪模式。
正则表达式还有很多,鉴于我初学的能力,慢慢来总结,记录下几个例子来帮自己回顾下:
1、找出/etc/passwd文件中的一位数或两位数:
2、找出当前系统上用户名与默认shell相同的用户:
[root@Exercises ~]# grep "^\(\<[[:alnum:]]\+\>\).*\1$" /etc/passwd
3、使用echo命令输出一个路径,使用grep实现basename的功能:
[root@Exercises ~]# echo "/etc/passwd/" |grep -o "[[:alnum:]]\+\/\?$" |cut -d/ -f1
passwd
4、执行ifconfig然后输出当前系统的ip:
[root@Exercises ~]# ifconfig | grep -E "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-3][0-9])\>(\.\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>){3}"
inet addr:192.168.1.111 Bcast:192.168.1.255 Mask:255.255.255.0
inet addr:192.168.88.20 Bcast:192.168.88.255 Mask:255.255.255.0
第一篇,很不完善,还是要继续总结,还是要坚持~
同时,求指正,求指正!谢谢~
原创文章,作者:AZ,如若转载,请注明出处:http://www.178linux.com/8686