[Linux 006]——grep和正则表达式
在使用系统时,我们或多或少的有一些搜索、查找的需求,必须要在文本中搜索某个关键字,或者过滤出文本中某些特定的行。grep 命令就为我们提供了这样一个功能,同时,grep 还可以使用正则表达式进行匹配,这是一个强大的功能,有必要好好掌握。
1.grep 初体验
grep PATTERN [OPTIONS] FILE:在文件中按照模式进行查找。FILE 是我们要查找的目标文件,如果不指定目标文件,grep 将会从标准输入中读取输入的内容,然后进行匹配。为了方便起见,本文的所有演示都在命令行中通过标准输入进行。
- grep PATTERN:最基本的用法,根据 PATTERN 进行查找

如果没有高亮显示匹配到的内容,可以手动指定:grep --color PATTER 进行匹配,更可以使用命令别名,减少我们的输入时间:alias grep="grep --color"。
- grep PATTERN -i:忽略大小写匹配
- grep PATTERN -v:反转输出。匹配到的内容不输出,只输出没被匹配到的内容。

- grep PATTERN -o:只显示匹配到的字串(PATTERN)。默认显示匹配到的字串所在的整行文本。
2.grep 和正则表达式
正则表达式(Regular Expression 或 REGEXP)分为基础正则表达式(Basic REGEXP)和扩展正则表达式(Extended REGEXP)。grep 默认采用基础正则表达式,如需使用扩展正则表达式需要附加选项。
由于介绍正则表达式实在太过复杂,我想了很久也无法很好的组织语言,因此这里就不再对正则中的元字符进行一一的介绍了。需要了解这方面的同学,可以去看一下三十分钟入门正则表达式系列的教程,应该很快就能学会。
- 使用 grep 进行简单的正则匹配
"[]" 表示匹配 [] 中出现的任意一个字符,[a-zA-Z] 表示匹配所有的英文字母。

"[^]" 表示匹配出去 [] 中出现的字符之外的任意字符。

在正则表达式中,'*' 号不再表示任意字符,而表示其前的字符可以出现任意次。有时候我们在命令中使用 '*' 进行通配符匹配文件,要注意它在正则表达式中的不同用法。在正则表示中使用 '.' 点号来匹配任意字符。
在正则中,'.' 点号表示不为空的任意字符。

".*" 表示匹配出现任意次数的任意字符。正则表达式默认处于贪婪模式,因此在第一次匹配到结果后,还会进行多次匹配,知道没有匹配为止。

"\?" 表示匹配前面的字符出现 0 次 或者 1 次,注意这个问号需要被转义。

"\{m,n\}" 表示前面的字符出现最少 m 次,最大 n 次。"\{m,\}" 表示前面的字符至少出现 m 次,"\{,n\}" 表示前面的字符至多出现 n 次。

'^' 和 '$' 是正则表达式中的两个位置锚定。'^' 表示其后的字符必须出现在行首,而 '$' 表示其前的字符必须出现在行尾,"^$" 表示匹配空白字符。

"\<" 和 "\>" 用来锚定单词,二者不一定要成对出现,也可以使用 "\b" 进行锚定。"\bWORD" (或者 "\<WORD\>") 表示匹配以 WORD 开头的单词,"WORD\b" 表示匹配以 WORD 结尾的单词,"\bWORD\b" 表示完完全全匹配 WORD 单词。

"\(\)" 表示对 PATTERN 进行分组,分组还支持后向引用,使用 "\1","\2" 等引用前面的分组。后向引用只匹配和前面相同的内容。

'|' 表示或,匹配其前或者其后的单词,注意并不是匹配字符,如需匹配字符,需要使用分组进行限定。我这里使用的是扩展正则,如需使用基本正则,需要将 '|' 换为 "\|"。

3.扩展正则表达式
grep 同时还支持扩展正则表达式,在使用扩展正则表达式是,需要使用 -E 选项。基础正则表达式和扩展正则表达式中的一些区别:
- 基础正则中使用 \?,扩展正则中使用 ?
- 基础正则中使用 \(\),扩展正则中使用 ()
- 基础正则中使用 \{\},扩展正则中使用 {}
在基础正则表达式中匹配 ?,(),{} ,不需要进行转移,而在扩展正则表达式中则需要加上转义符号 \。
扩展正则表达式中的其他选项:
- \s:匹配空白字符
- \S:匹配非空白字符
- \w:匹配字母,数字,相当于 [0-9a-zA-Z]
- \W:不匹配字母和数字,相当于 [^0-9a-zA-Z]
4.grep 的其他选项
- grep PATTERN FILE -A NUM:使用 grep 进行匹配之后,显示匹配的行,同时向后显示指定的行
- grep PATTERN FILE -B NUM:和上面相反,向后显示指定行
- grep PATTERN FILE -C NUM:进行匹配之后,分别向前和向后显示指定的行,相当于 -AB NUM
- grep PATTERN FILE -c:显示被匹配到的行数
- grep PATTERN FILE -F:相当于 fgrep
- grep PATTERN FILE -P:使用 Perl 风格的正则表达式
- \d:匹配任意十进制数字,相当于 [0-9]
- \D:匹配任意非数字字符,相当于 [^0-9]
5.egrep 和 fgrep
在使用 grep 时,如果想要开启扩展正则表达式,需要指定 -E 选项,而 egrep 命令则是默认支持扩展正则表达式。因此在需要使用扩展正则表达式时推荐使用 egrep 代替 grep -E。
fgrep 表示快速匹配,不支持正则表达式,没有转义的概念,会对 PATTERN 中的所有字符进行匹配。
6.总结
本篇我们介绍了 grep 命令和正则表达式的基本使用,grep 是 Linux 下的一个文本处理命令,配合正则表达式使用,其功能非常强大。grep 主要用来查找操作,如果想使用替换等更加强大的功能,就需要使用 sed 或者 awk 命令。grep,sed,awk 被称为 Linux 下的三个文本处理杀器,等学到相应的章节再继续介绍 :)
作者:Charleylla 转载请注明出处:http://www.cnblogs.com/charleylla/p/5988885.html
[Linux 006]——grep和正则表达式的更多相关文章
- Linux之grep及正则表达式
grep简介 grep 是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来.通常grep有三种版本grep.egrep(等同于grep -E)和fgrep.egrep为扩展的g ...
- linux命令grep及正则表达式
- linux grep和正则表达式
虽然正则表达式经常都在用,但是很少能够静下心来仔细的总结一下.最近看了一个台湾人的网站叫做鸟哥Linux私房菜,关于正则表达式的描述挺详细的.在此,我进行一下总结,如果想仔细的学习正则表达式,请访问鸟 ...
- Linux文本处理三剑客之grep及正则表达式详解
Linux文本处理三剑客之grep及正则表达式详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Linux文本处理三剑客概述 grep: 全称:"Global se ...
- Linux grep与正则表达式
grep命令 格式:grep [-acinv] [--color=auto] '查找字符串' filename -a 将binary文件以text文件的 -c 计算找到 ‘查找字符串’ ...
- linux初级学习笔记十:linux grep及正则表达式!(视频序号:04_4)
本节学习的命令:grep 本节学习的技能: grep对文本的匹配 正则表达式的使用 知识点十:grep及正则表达式(4_4) grep,egrep,fgrep: grep: 根据模式搜索文本,并将符合 ...
- 由一条Linux的grep命令说起
今天在开发的时候,看到同事使用了这样的一条linux命令 grep 'class YourClass' -rwi * |grep -v svn 想到了 grep命令的,几个参数. -r 明确要求搜索子 ...
- 菜鸟学Linux命令:grep配合ls等使用
linux grep命令 (global search regular expression(RE) and print out the line )是一种强大的文本搜索工具,它能使用正则表达式搜索文 ...
- linux 命令grep
linux 命令grep grep命令用来搜索文本,或从给定的文件中搜索行内包含了给定字符串或单词的文件.通常来说,grep显示匹配的行.使用grep来搜索包括一个或多个正则表达式匹配到的文本行,然后 ...
随机推荐
- spring-boot集成swagger
1.引入swagger需要的java类库 <dependency> <groupId>io.springfox</groupId> <artifactId&g ...
- Linux 磁盘管理的命令
Linux 磁盘管理 磁盘分区及挂载: 先查询系统的使用情况: 使用fdisk -l语句 查询结果: 进行磁盘的新建:***添加磁盘时系统必须处于关机状态** 在进行对系统磁盘的使用情况的查询 查 ...
- 【Python数据挖掘】决策树、随机森林、Bootsing、
决策树的定义 决策树(decision tree)是一个树结构(可以是二叉树或非二叉树).其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别. ...
- git学习(7)标签管理
git学习(7)标签管理 1. 建立标签 在发布版本时候,我们通常会在版本库中打一个标签,这样就唯一确定了打标签的版本,有点像个里程碑,这里会有一个指向某个commit的指针 打标签很简单,首先切换到 ...
- 苏宁易购微信端 wx ios android other 通过js来控制样式
<!DOCTYPE HTML><html><head><meta charset="UTF-8"><meta name=&qu ...
- 一个非常棒的jQuery 评分插件--好东西要分享
现在做网页已经不仅限于实现功能了,更多的是要实现功能的同时追求更加美观的实现.比如页面上让用户评分的功能,你完全可以放5个RdioButton让用户选择分数,也可以用DropDownList来实现,但 ...
- window下cmd的宽度调整
一直被cmd的宽度这么了好些年,刚才搜索了下,还真可以设置.标题栏右键属性,调整屏幕缓冲区宽度,只要足够长就不会换行了,然后调整窗口大小-宽度,不能超过屏幕缓冲区宽度,当小于屏幕缓冲区的时候,就会显示 ...
- 剑指Offer——二叉树的深度
题目描述: 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 分析: 二叉树的深度等于其左子树的深度和右子树的深度两个中最大的深 ...
- 【react路由】react 路由被自动加了个#
路由自动加#是由hashhistory造成: https://segmentfault.com/q/1010000012097148 单页面应用 前端跳转 or 服务器跳转: https://my.o ...
- windbg遍历进程页表查看内存
2016-12-09 近期想查看下系统分配了的页的页表项的标志位,但是发现资料较少,所以还是记录下,希望可以对某些朋友有所帮助! 系统:win7 32位虚拟机 平台:KVM虚拟化平台 win7 32位 ...