grep命令与正则表达式
什么是grep:
grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Unix的grep家族包括grep、egrep和fgrep。egrep支持扩展正则表达式的grep,fgrep快速搜索,不支持正则表达式。
grep命令:
–color:相当于auto,对匹配到的文本进行着色显示
-v:显示不被pattern匹配到的行(取反,找出不包含“pattern”的行)
-i: 忽略字符大小写
-n:显示匹配到的行号
-c:显示统计匹配到的行数,等同于wc -l
-o:仅显示匹配到的字符串
-q:静默模式,不输出任何信息
-A # :after ,后#行 (#:数字)
-B # :before ,前#行
-C # :context, 前后各#行
-e :实现多个选项间的逻辑or关系
-w:匹配整个单词
-E:相当于egrep,支持扩展的正则表达式
-F: 相当于fgrep,不支持正则表达式
正则表达式
概念:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
目的:
- 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);
-
可以通过正则表达式,从字符串中获取我们想要的特定部分。
特点: - 灵活性、逻辑性和功能性非常的强;
- 可以迅速地用极简单的方式达到字符串的复杂控制。
对于刚接触的人来说,比较晦涩难懂。
正则表达式引擎
正则引擎主要可以分为两大类:一种是DFA,一种是NFA。
DFA 引擎在线性时状态下执行,因为它们不要求回溯(并因此它们永远不测试相同的字符两次)。DFA 引擎还可以确保匹配最长的可能的字符串。但是,因为 DFA 引擎只包含有限的状态,所以它不能匹配具有反向引用的模式;并且因为它不构造显示扩展,所以它不可以捕获子表达式。
传统的 NFA 引擎运行所谓的“贪婪的”匹配回溯算法,以指定顺序测试正则表达式的所有可能的扩展并接受第一个匹配项。因为传统的 NFA 构造正则表达式的特定扩展以获得成功的匹配,所以它可以捕获子表达式匹配和匹配的反向引用。但是,因为传统的 NFA 回溯,所以它可以访问完全相同的状态多次(如果通过不同的路径到达该状态)。因此,在最坏情况下,它的执行速度可能非常慢。因为传统的 NFA 接受它找到的第一个匹配,所以它还可能会导致其他(可能更长)匹配未被发现。
元字符分类:字符匹配、匹配次数、位置锚定、分组
字符匹配:
常用选项:
. :匹配任意单个字符
[abc]:a|b|c
[^abc]:除abc之外的字符
[:alnum:]:字母和数字
[:alpha:]:英文大小写字符 a-z A-Z
[:lower:]:小写字母
[:upper:]:大写字母
[:space:]:专门匹配空格
不常用选项:
[:cntrl:]:不可打印的控制字符(退格、删除、警铃……)
[:digit:]:十进制数字
[:xdight:]:十六进制数字
[:graph:]:可打印的非空白字符
[:print:]:可打印字符
[:punct:]:标点符号
匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数
* : 匹配前面的字符任意次,0到无穷
.*:任意字符出现任意次,比如说 123 456 abc
a*:a字符出现任意次 aaaa aa
[[:lower:]]*:任意小写字母出现任意次
\? :匹配前面的字符出现0次或1次
例:a\? 出现0次或1次
\+:匹配前面的字符至少1次
例:a+ a至少出现1次
\{n\}:前面的字符出现n次
例:[0-9]\[3\] 000-999
\{m,n\}:匹配前面的字符出现m到n次,m、n是一个范围
\[,n\]:匹配前面的字符最多出现n
例:[0-9]\{,3\}最大匹配是999
\{m,\}:匹配前的字符至少出现m次
[0-9]\{3,\} 000 无穷
位置锚定:用来定位字符出现的位置
^ : 锚定行首
$: 锚定行尾
^$ :匹配空行的
^[[:space:]] :行首是空白的字符
^[[:space:]]*$:也是空行
^a:以a开头的行
b$:以b结尾的行
^a.*b$:以a开头,中间任意字符,以b结尾
^a.*[[:space:]]\{3\}.*b$:以a开头跟任意字符,中间出现三次空格在跟任意字符以b结尾的行
^#:以#开头的行
\b \b :匹配词首和词尾
\< >:匹配次首和词尾
\broot \b = \<root \>
分组:将匹配规则分成不同的组 使用1 2 3 … 等数字去标示,便于后面使用同样规则的时候可以直接引用
\| : 或
例:a \| b a或b
扩展正则表达式
. :单个字符
[ ]:中括号范围内的字符
*:匹配前面字符的任意次
?:0或者1次
+:1次或者多次
{m}:匹配m次
{m,n}:至少m次 至多n次
|:或者 a|b a或者b
^:行首
$:行尾锚定
\<,\b:语首
\>,\b:语尾
( ):分组 向后引用 \1 \2
原创文章,作者:木,如若转载,请注明出处:http://www.178linux.com/72810
评论列表(1条)
详细介绍了grep命令与正则表达式的使用,内容写的非常详细,但需要注意一下排版的问题,也可以适当的加入图片