grep家族中的grep及egrep的相应的正则表达式和用法。
1.grep家族是文本处理三大剑客之一。(grep,sed,awk)
grep: (Global search REgular expression and Print out the line).其支持使用基本正则表达式.
egrep:支持使用扩展正则表达式
fgrep:不支持使用正则表达式(一般在大型web网站日志搜索时所使用)
grep的作用:过滤查找关键词并打印匹配的行。
grep的用法: grep [选项] 匹配模式 [文件]....
2. 正则表达式:Reguiar Expression,简称REGEX。
用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。
在很多文本编辑器或其他工具里,正则表达式通常被用来检索或替换那些符合某个模式的文本内容。
正则表达式分两类:基本正则表达式:BRE :扩展正则表达式:ERE
3.grep的几个常用选项:
--color=auto:显示颜色,(默认centos7已经被设置)
-n:显示行号
-c:统计符合要求的行数
-v:取反,不包含所选字符的
-i:不区分大小写
-w: 匹配单词
-q:静默模式,不输出任何信息
-o:仅显示匹配到的文本自身
4. 字符匹配:
.:匹配任意单个字符;
[]: 匹配范围内的任意单个字符;
[^ ]:非匹配范围内的任意单个字符:
5.匹配字数:用在要指定其出现的次数的字符后面,用限制其前面的字符要出现的次数;默认工作于贪婪模式
*:匹配前面的字符任意次(包括0次)图中画横杠的就表示其出现了0次
\+:匹配前面的字符至少1次: 与上一个图片对比,没有C的行,没有被匹配到。
.*:匹配任意长度任意字符
\?:匹配部分前面的0次或1次 主意:比如匹配"x+?y"模式中,"xxxyacn"也可被匹配到。
它是从Y往前1个单位查的”xy"。因为?表示0到1个,请不要搞混。
\{m\}:其前面的字符出现M次,M非负数
由图片我们可以看到当我们选择“c\{2\}"时表示c最少出现2次由于没有cc所以我们什么都没有匹配到,但当我们将c换成r时就可以匹配到很多。
\{m,n\}:其前面字符至少出现m次最多出现n次,例如r\{2,3\}。表示r最少出现2次最多出现3次
6.位置限定:限制模式匹配到的文本只能出现于目标文本的那个位置;
^:行首限定:^PATTERN
$:行尾限定:PATERN$
^PATERN$:空行。表示PATERN自己为完整的一行
因为/etc/passwd中没有b..h为一整行,所以没有匹配到。
“^$”:空白行
单词:由非特殊字符组成的连续字符包括字符串,都称为单词。
\<或\b:词首锚定,用于单词模式的左侧,格式为\<PATTERN, \bPATTERN
\>或\b:词尾锚定,用于单词模式的右侧,格式为PATTERN\>, PATTERN\b
\<PATTERN\>:单词锚定;
\(PATTERN\):将此PATTERN匹配到的字符当作一个不可侵害整体进行处理;
7.分组括号中的模式匹配到的字符会被正则表达式引擎自动记录于内部的变量中,
这些变量是\1, \2, \3, ...
pat1\(pat2\)pat3\(pat4\(pat5\)pat6\)
\n:模式中第n个左括号以及与之匹配的右括号之间的模式所匹配到的字符串;(不是模式,而是模式匹配的结果)
\1:第一组括号中的pattern匹配到的字符串;(pat2\)
\2:第二组括号中的pattern匹配到的字符串;(pat4\(pat5\)pat6\)
\3: 第三组括号中的pattern匹配到的字符串;(pat5)
分组引用例子:
He love his lover. *\(l..e\).*\1r 符合
He like his lover. *\(l..e\).*\1r 不符合
He love his liker. *\(l..e\).*\1r 不符合
He like his liker. *\(l..e\).*\1r 符合
后向引用:引用前面的括号中的模式所匹配到的字符串:
8.常用选项之二:
-E, --extended-regexp:支持使用扩展正则表达式
-F, --fixed-strings:支持使用固定字符串,不支持正则表达式,相当于fgrep;
-G, --basic-regexp:支持使用基本正则表达式;
-P, --perl-regexp:支持使用pcre正则表达式
-e. PATTERN, --regexp=PATTERN:多模式机制;
-f FILE, --file=FILE:FILE为每行包含了一个pattern的文本文件,即grep script;
-A NUM, --after-context=NUM表示每一行被隔开后还有显示后num行
-B NUM, --before-context=NUM 表示前面NUM行
-C NUM, -NUM, --context=NUM 表示前后各NUM行
9.egrep:支持使用扩展正则表达式的grep命令,它能完成grep能完成的和不能完成的命令。
相当于grep -E
用法:egrep [OPTIONS] PATTERN [FILE...]
其选项与grep 一样,这里就不在重新介绍了
扩展正则表达式的元字符:
字符匹配:
.:任意单个字符
[ ]:范围内的任意单个字符
[^ ]:范围外的任意单个字符
匹配次数:
*:任意次;
?:0次或1次;
+:1次或多次;无需转意
{m}:匹配m次;无需转意
{m,n}:至少m次,至多n次;无需转意
注意“\”转意符
位置锚定:
^:行首
$:行尾
\<, \b:词首
\>, \b:词尾
分组及引用:
(pattern):分组,括号中的模式匹配到的字符会被记录于正则表达式引擎内部的变量中;
后向引用:\1, \2, ...
或者:
a|b:a或者b
C|cat:表示C或cat
(C|c)at:表示Cat或cat。
本人是刚刚接触Linux运维不到2个星期的新人菜鸟,以前也完全没有学过计算机,完全的零基础。
对于grep,egrepd的正则表达式和用法,目前也就只能梳理出这点来。上述有错误的地方还请各位老师帮忙多多指正,本人万分感谢。