一、文本搜索工具中的grep和egrep
grep (global search regular expression_r(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。
二、grep的工作方式
grep在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容。
grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1-255中一个数值。我们利用这些返回值就可进行一些自动化的文本处理工作。
三、正则表达式
正则表达式又称正规表达法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。
正则表达式分两类:
1、基本正则表达式 BRE
2、扩展正则表达式 ERE
正则表达式引擎:利用正则表达式模式分析给定文本的程序。
四、grep家族
grep: (Global search REgular expression and Print out the line.) 支持使用基本正则表达式;
egrep:支持使用扩展正则表达式;
fgrep:不支持使用正则表达式;
五、grep命令
grep的主要功能用于检索文件内容,字符串等的工具。可以根据用户指定的“模式(pattern)”对目标文本进行搜索过滤,显示出被“模式pattern”匹配到的行。
注意:CentOS 7中alias中有grep='grep--color=auto',CentOS 6中没有,需要手动添加,然后搜索的内容高亮显示。
其基本语法是:
grep [OPTIONS] PATTERN [FILE...]
PATTERN:是文本字符和正则表达式的元字符组合而成的匹配条件,可用单引号‘ ’将pattern括起来以避免shell通配的影响,强引用不替换而显示字符本身。" "双引号,字符串中的` `,$,\等特殊字符会被shell解释替换后,再传递给grep。对普通的字符串(没有特殊字符和空格的字符串)也可以不加引号,直接搜索。
OPTIONS:(这里给出常用的选项)以CentOS 7为例介绍
-i忽略大小写
-c显示被匹配到的行数
-n输出行号
-v反向选择,即找没有搜索字符串的行
-w匹配单词
-A #连同匹配行的下#行一并显示,#代表任意数字
-B #连同匹配行的上#行一并显示,#代表任意数字
-C #连同匹配行的上下#行一并显示,#代表任意数字
-R或-r递归搜索目录或子目录下匹配的字所在文件(可配合find命令
-E相当于egrep支持扩展的正则表达式
-F相当于fgrep不支持正则表达式
-e PATTERN,--regexp=PATTERN:多模式机制;
-f FILE,--file=FILE:FILE为每行包含了一个pattern的文本文件,即grep script;
案例:写一个nano脚本,命令为mybit,内容为 r..t,
-V 显示grep版本
-L:输出时只显示不包含匹配项的文件名,通常与-r选项连用来查找带指定内容的文件。
六、grep基本正则表达式的元字符集
注意:可直接按要求匹配,也可以通过管道的方式表达
1、字符匹配
.:匹配任意单个字符;
[ ]:匹配范围内的任意单个字符;
[^ ]:匹配范围外的任意单个字符;
[[:digit:]]:任意数字
[[:lower:]]:任意小写字母
[[:upper:]]:任意大写字母
[[:alpha:]]:任意字母
[[:alnum:]]:任意字母和数字
[[:space:]]:空白字符
[[:blank:]]:空格和Tab键
[[:punct:]]:任意标点符号
*:匹配前面的字符任意次(0,1或多次)
.*:任意长度的任意字符
\+:匹配前面的字符至少1次;
案例:grep "m\+y" 匹配y前面至少出现一个m的行
mmxyabc 可以
yabc 不可以
abcmy 可以
abcy 不可以
\?:匹配前面的0次或1次,即前面的字符可有可无;
案例:grep "q\?z" 匹配字符z前面出现了一个q或者没有q的行
xqxzabc 可以
zabc 可以
abcq 不可以
abcz 可以
\{m\}:其前面的字符出现m次,m为非负整数;
案例:grep "x\{2\}y":
xxxyabc 可以
yabc 不可以
abcxy 不可以
abcy 不可以
\{m,n\}:其前面的字符出现至少m次,至多n次;即[m,n]
\{0,n\}:至多n次;
\{m,\}:至少m次;
3、位置锚定:限制使用模式搜索文本,限制模式所匹配到的文本只能出现于目标文本的哪个位置;
^:行首锚定;用于模式的最左侧,^PATTERN
$:行尾锚定;用于模式的最右侧,PATTERN$
^PATTERN$:要让PATTERN完全匹配一整行;
^$:空行;
^[[:space:]]*$:空行或空白行
单词:由非特殊字符组成的连续字符(字符串)都称为单词;
\<或\b:词首锚定,用于单词模式的左侧,格式为\<PATTERN,\bPATTERN
\>或\b:词尾锚定,用于单词模式的右侧,格式为PATTERN\>,PATTERN\b
\<PATTERN\>:单词锚定;
4、分组与引用:
\(PATTERN\):将此PATTERN匹配到的字符当作一个不可侵害整体进行处理;
Note:分组括号中的模式匹配到的字符会被正则表达式引擎自动记录于内部的变量中,这些变量是\1,\2,\3,...
pat1\(pat2\)pat3\(pat4\(pat5\)pat6\)
\n:模式中第n个左括号以及与之匹配的右括号之间的模式所匹配到的字符串;(不是模式,而是模式匹配的结果)
\1:第一组括号中的pattern匹配到的字符串;
\2:第二组括号中的pattern匹配到的字符串;
后向引用:引用前面的括号中的模式所匹配到的字符串;
案例:写一个nano脚本,命名为grep.txt,内容如下:
He love his lover.
He like his lover.
He love his liker.
He like his liker.
七、egrep扩展正则表达式的元字符集 相当于grep -E。
egrep [OPTIONS] PATTERN [FILE...]
1、字符匹配
.:任意单个字符
[ ]:范围内的任意单个字符
[^ ]:范围外的任意单个字符
2、次数匹配:限制字符出现的次数;默认工作于贪婪模式,同前面的grep用法相似,只是不再需要添加转义字符\
*:任意次;
?:0次或1次;
案例:grep "q?z" 匹配字符z前面出现了一个q或者没有q的行
xqxzabc 可以
zabc 可以
abcq 不可以
abcz 可以
+:1次或多次;
案例:grep "m+y" 匹配y前面至少出现一个m的行
mmxyabc 可以
yabc 不可以
abcmy 可以
abcy 不可以
{m}:匹配m次;
案例:grep "x{2}y"
xxxyabc 可以
yabc 不可以
abcxy 不可以
abcy 不可以
{m,n}:至少m次,至多n次;
{0,n}
{m,}
3、位置锚定:限制使用模式搜索文本,限制模式所匹配到的文本只能出现于目标文本的哪个位置;
^:行首锚定;用于模式的最左侧,^PATTERN
$:行尾锚定;用于模式的最右侧,PATTERN$
\<,\b:词首
\>,\b:词尾
4、分组与引用:用法同grep一样。
\(PATTERN\):将此PATTERN匹配到的字符当作一个不可侵害整体进行处理;
Note:分组括号中的模式匹配到的字符会被正则表达式引擎自动记录于内部的变量中,这些变量是\1,...
pat1\(pat2\)pat3\(pat4\(pat5\)pat6\)
\n:模式中第n个左括号以及与之匹配的右括号之间的模式所匹配到的字符串;(不是模式,而是模式匹配的结果)
\1:第一组括号中的pattern匹配到的字符串;
\2:第二组括号中的pattern匹配到的字符串;
后向引用:引用前面的括号中的模式所匹配到的字符串;
5、或者:
a|b:a或者b
(C|c)at:表示Cat或cat
C|cat:表示C或cat