在Linux系统当中,处理文本有三个常用的工具,俗称文本处理三剑客,grep就是其中之一。
grep是一种强大的文本搜索工具,它的全称是:Globally search a Regular Expression and Print。工作原理是基于正则表达式引擎按给定的“pattern”对文本进行搜索过滤操作,并把匹配的行打印出来。因此了解要grep的用法我们可以从两方面着手,1:grep命令的用法,2:正则表达式。
1,grep命令的使用方法
首先我们可以使用man命令查看一下grep的使用帮助。
第一种使用格式为:grep [OPTIONS] PATTERN [FILE...]
使用示例:
可以看出它的作用是:根据“root(过滤条件)”对目标文本逐行进行匹配检查;打印出符合条件的行。
常用选项 --color=auto :对匹配到的文本着色后高亮显示;
使用示例:
因为在centOS7中,shell的环境变量配置文件中已经定义了别名grep=“grep --color=auto”(可以通过type命令查看),所以演示时我们先执行撤销别名操作。
看以看出这种方式显示结果更为直观,因此下面的示例中我们使用的grep命令都是已经定义了grep=grep --color=auto的别名。
常用选项 -i:忽略字符大小写;
使用示例:
常用选项 -o:仅显示匹配 到的文本自身;
使用示例:
常用选项 -v, --invert-match:反向匹配;
使用示例:
常用选项 -q, --quiet, --silient:静默模式,不输出任何信息;
使用示例:
常用选项 -A NUM, --after-context=NUM:同时显示匹配到的文本行和它的后NUM行
使用示例:
常用选项 -B NUM, --before-context=NUM:同时显示匹配到的文本行和它的前NUM行
使用示例:
注:被匹配到的一行没有同时显示它的前两行是因为它本身已经是文本的第一行。
常用选项 -C NUM, -NUM, --context=NUM:同时显示匹配到的文本行和它的前后NUM行
使用示例:
第二种使用格式 grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
这个使用使用格式又有两种方式
第一种使用-e选项: -e PATTERN, --regexp=PATTERN:多模式机制;
使用示例:
第二种使用-f选项: f FILE, --file=FILE:FILE为每行包含了一个“pattern”的文本文件,即grep script;
使用示例:
第二部分:使用用正则表达式
正则表达式:Regular Expression, REGEX
由一类特殊字符及文本字符所编写的模式,其有些字符不表示其字面意义,而是用于表示控制或通配的功能;
正则表达式可分为两类:
1,基本正则表达式:BRE(Basic Regular Expression)
1)元字符:
.:表示匹配任意单个字符
使用示例:
[ ]:匹配范围内的任意单个字符
[^];匹配范围外的任意单个字符(取反)
使用示例:
常用范围表示区间:
[[:digit:]]:表示所有数字[0-9]
[[:lower:]]:表示所有小写字母,等同于[a-z]
[[:upper:]]:表示所有大写字母,等同于[A-Z]
[[:alpha:]]:表示所有字母,等同于[a-zA-Z]
[[:alnum:]]:表示所有字母和数字,等同于[a-zA-Z0-9]
[[:graph:]]:表示所有非空字符(不包含空格和控制字符)
[[:cntrl:]]:表示所有控制字符
[[:punct:]]:表示所有标点符号
[[:print:]]:表示所有非空字符(包含空格)
[[:space:]]:表示空白字符
详情可使用man 7 glob查看。
使用示例:
2)匹配次数:用在要指定其出现次数的字符的后面,作用是限制其前面的字符出现的次数;默认工作于贪婪模式;
*:匹配前面的字符任意次(0,1或多次),那么 .* 可以表示为任意字符出现任意次,即任意长度的任意字符。
\+:匹配前面的字符至少一次
\?:匹配前面的0次或1次,即前面的字符可有可无
\{m\}:匹配前面的字符m次,m为非负整数
\{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匹配到的字符当作一个不可侵害整体进行处理;
注意:分组括号中的模式匹配到的字符会被正则表达式引擎自动记录于内部的变量中,这些变量是\1, \2, \3, ...
pat1\(pat2\)pat3\(pat4\(pat5\)pat6\)
\n:模式中第n个左括号以及与之匹配的右括号之间的模式所匹配到的字符串;(不是模式,而是模式匹配的结果)
\1:第一组括号中的pattern匹配到的字符串;
\2:第二组括号中的pattern匹配到的字符串;
……
后向引用:引用前面的括号中的模式所匹配到的字符串;
使用示例
常用选项:
-E, --extended-regexp:支持使用扩展正则表达式;
-F, --fixed-strings:支持使用固定字符串,不支持正则表达式;
-G, --basic-regexp:支持使用基本正则表达式;
-P, --perl-regexp:支持使用pcre正则表达式;
2,扩展正则表达式:ERE(Extend Regular Express)
与基本正则表达式相同之处:
元字符: . ; * ;[ ];[^]
位置锚定:
^:行首锚定;
$:行尾锚定;
与基本正则表达式不同之处:
匹配次数:
+:匹配前面的字符至少一次,等同于基本正则表达式中 \+
?:匹配前面的0次或1次,等同于基本正则表达式中 \?
{m}:匹配前面的字符m次,等同于基本正则表达式中 \{m\}
{m,n}:匹配其前面的字符至少m次,等同于基本正则表达式中\{m,n\}
{0,n}:最多匹配其前面的字符n次,等同于基本正则表达式中 \{0,n\}
{m,}:最少匹配其前面的字符m次,等同于基本正则表达式中 \{m,\}
分组及引用:
(pattern):等同于基本正则表达式中 \(pattern\),引用方式和基本正则表达式相同,都为后向引用:\1, \2, ...
相比与基本正则表达式增加的功能
| :或者
a|b:表示a或者b
C|cat:表示C或cat
(C|c)at:表示Cat或cat
使用示例
egrep:支持使用扩展正则表达式的grep命令,相当于grep -E;
fgrep:支持使用扩展正则表达式的grep命令,相当于grep -F;
原文地址:http://puro2016.blog.51cto.com/11222749/1748786