Linux grep,egrep及相应的正则表达式用法详解
linux在进行文本处理过程中的文本搜索工具称为正则表达式。文本搜索工具有grep、egrep、fgrep,egrep为正则表达式的扩展正则表达式,fgrep用于搜索文本字符串,与 grep 和 egrep 命令不同,因为它搜索字符串而不是搜索匹配表达式的模式。grep的含义为: global search Regular expression and Print out the line。
正则表达式(REGular EXPression REGEXP)是由元字符及正常字符所书写的模式,其中的元字符不表示字符本身的意义,而是用于表达控制或通配功能,根据用户指定的文本模式(正则表达元字符以及正常字符组合而成)对目标文件进行逐行搜索,显示能匹配到的行。
首先讲述的是正则表达式grep指令的用法以及一些常用的选项的应用以及简单的示例:
grep [OPTIONS] PATTERN [FILE...]
--color=auto 自动显示 }
always 有时 } 对匹配到内容是否自动显示为红色
never 从不显示 }
-o:只显示被匹配到的内容
-i:ignore case ,所有的不区分字符大小写
-v: 显示不能够被模式匹配到的行
-E :使用扩展的正则表达式
-A # : 被模式所匹配的行以及后面#行
-B#:被模式所匹配的行以及前面#行
-C#:被模式所匹配的行以及前后#行
示例1:显示匹配到的字符红色
[root@localhost ~]# grep --color=auto "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
示例2:只显示匹配到的内容
[root@localhost ~]# grep -o --color=auto "root" /etc/passwd
root
root
root
root
下面讲的是基本正则表达式的元字符:
字符匹配:
. :匹配单个字符
[]:匹配指定范围内的任意单个字符
例: [root@localhost ~]# grep "[Cc]a" /etc/rc.d/rc.sysinit
匹配出现Ca或ca,a不作为结尾,C/c不作为开头,匹配Ca或者ca在文本中每行的任意位置。
[^] :匹配指定范围外的任意单个字符
[0-9]、[[:digit:]]表示0-9中的任意的单个数字
[^0-9]、[^[:digit:]]表示0-9范围外的任意单个字符
[a-z]、[[:lower:]]表示a-z中任意一个小写字母
[A-Z]、[[:upper:]]表示A-Z中任意一个大写字母
[[:space:]]表示一个空格符
[[:punct:]]表示任意一个标点符号
[0-9a-zA-Z]、[[:alnum:]]表示任意一个数字或字母
[a-zA-Z]、[[:alpha:]]表示任意一个大写字母或小写字母
次数匹配:在期望匹配字符后面提供一个控制符,用于表达匹配前面字符指定的次数。
* :任意次数
例:"ab*c" ab……bc匹配任意个b abbc ,ac 可以匹配到 abb, 不能匹配到 .* : 任意长度的任意字符 (贪婪模式,会仅可能的去匹配)
例
[root@localhost ~]# grep "r.*t" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
\? :0次或1次 ,表示其左侧字符可有可无 " ab \?c " abc ,ac 可以 abbc 不可以
\+ : 1次或多次,表示其左侧字符至少出现1次;
" ab \+c " ac ,不可以 abc,abbbbc 可以
\{m\} :m次,表示其左侧字符精确出现m次; \{m,n\}:表示其左侧字符至少出现m次,至多出现n次; "ab\{2\}c" 匹配2次 -> abbc
\{0,n\} : 至多n次 "ab\{0,3\}c" 0~3次 -> ab、 abbc 、abbbc \{m,\} : 至少m次
"ab\{1,\}c" -> ab、 abbc 、abbbc 、 ab…bc
位置锚定:
^ :锚定行首,^ PATTERN
$:锚定行尾,PATTERN$
^PATTERN$ :用模式来匹配整行内容
^$ :匹配空白行;
例:用于匹配整行内容
[root@localhost ~]# grep "^sh.*sh$" /etc/passwd
sharang:x:5002:5002::home/sharang:/bin/tcsh
单词锚定: 由非特殊字符组成的连续的字符串
锚定单词词首: \< PATTERN或\b [root@localhost tmp]# grep "\<sh" /etc/passwd
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
锚定词尾: PATTERN\>或PATTERN \b
\<PATTERN\>:匹配到PATTERN能匹配到整个单词
例:匹配两位数字
[root@localhost ~]# ifconfig | grep "\<[0-9]\{2\}\>"
eth0 Link encap:Ethernet HWaddr 00:0C:29:5A:B6:F5
inet addr:192.168.191.16 Bcast:192.168.191.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe5a:b6f5/64 Scope:Link
分组:\(\)
注意:分组中的模式,在某次的具体匹配过程中所匹配到的字符可以被grep记忆 (保存于内置的变量 中,这些变量是 \1 , \2 ,…) 因此,还可以被引用
\1 : 引用,模式自左而右,由第一次左括号以及与之对应的右括号中的模式所匹配到的内容
\2 :引用 ,模式中自左而右,由第二个左括号以及与之对应的右括号中的模式所匹配到的内容;
\(ab\(cd\)\) \1 \2 \1匹配到ab \2匹配到cd
(1) He like his lover. (2) He like his liker. (3) She love her lover. (4) She love her liker.
"\(l..e\).*\1" 可以匹配上面内容
下面说下扩展的正则表达式egrep,也是通过搜索匹配表达式的模式,不过于grep的区别就是不需要添加转义符\ ,字符匹配、次数匹配、位置锚定、分组的用法是相同的。
字符匹配: .:匹配单个字符
[]:匹配任意单个字符
[^]:匹配范围外的任意单个字符
次数匹配:
*:任意次
?:0次或1次
+ :至少1次
{m}:精确匹配m次
{m,n}: 至少m次,至多n次
{m,}:至少m次
{0,n}:至多n次
位置锚定:
^: 锚定行首
$ : 锚定行尾
\<、\b:锚定词首
\>、\:锚定词尾
分组:
(): 引用为: \1,\2...
或者:
a|b :a或b,或者两侧的所有内容;
例:匹配meminfo中S或s开头的行
# egrep "^(S|s)" /proc/meminfo
最后的fgrep命令是用来查找一个或多个与给出的字符串或词组相匹配文件中的行。fgrep 查询速度比grep命令快,但是不够灵活:它只能找固定的文本,而不是规则表达式。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。