grep及正则表达式
来源:互联网 发布:知乎手机版怎么收藏 编辑:程序博客网 时间:2024/06/14 01:59
grep及正则表达式(文本查找)
grep的英文全称:Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用特定模式PATTERN(包括正则表达式)去匹配搜索文本,并将符合模式的文本行显示到屏幕。grep家族包括grep、egrep和fgrep。
用法定义:
grep [OPTIONS] PATTERN [FILE...]
PATTERN:由文本和正则表达式的元字符组合而成的匹配条件
OPTIONS:
-i 忽略大小写
--color或--colour 将匹配文本以颜色显示 alias grep='grep --colour'
-v 显示没有被模式匹配的行(被匹配的行不显示,不被匹配的行反而显示)
-o 只显示被模式匹配到的字符串本身,每一个字符串显示为一行
传统元字符:
* 任意长度的任何字符
? 任意单个字符
[] 指定范围内的
[^] 指定范围外的
正则表达式:Regular Expression,由元字符组成,但意义有所区别。
正则表达式中的元字符:
. 点表示匹配任意单个字符
表字符匹配个数/次数的元字符:
*表示匹配前面的字符任意次
如test文件的字符为a,b,ab,aab,acb,adb,amnb
a*b *这里不是指任意长度的任意字符,而是指匹配其前面的字符a任意次(0次也行,代表a不出现),但后面必须是b
(用途:搜索后面字符必须为b,但b前面的字符为a的任意长度(0代表可以没有a)的字符。换句话说,查看多少含有b的字符串,且满足前面含有a或者没有a出现的这种字符串的数量。)
a.*b .表示任意字符,*表示这个任意字符出现任意次(用途:a开头,b结束,中间可以是任意字符。)
.*表示任意长度的任意字符
注意:对于“amnbmnbmnb”也在结果之中。体现正则表达式的一种工作贪婪或者完备机制,尽可能长的匹配出所有符合要求的结果。
\?(要配合转义字符使用)匹配其前面的字符1次或0次(可选-?前面字符可有可没有,关键?后面的字符一定得有。--典型的grep部分匹配,grep功用--要弄清楚能匹配到哪些部分,且明白显示输出是整行)。
a?b 只要出现b的地方都符合要求,a可以紧挨着出现或者不挨着或者干脆没有a出现都可行。
\{m,n\}匹配其前面的字符(也可以是元字符中的点)至少m次,最多n次。--用于次数匹配
注意:这里一定要加反斜线(因为bash shell中反斜线为命令行展开,这里加反斜线的目的其意思告诉命令行不要展开,这个{}就被grep理解为特定的用途)
\{1,\} 匹配其前面的字符至少一次,最多不限制。
\{0,3\} 匹配其前面的字符可以不匹配,但匹配最多三次。
删除添加的两行,恢复如初。再看下面的表达式有何不同
不难看出,符号“.”可代表任意单个字符,多少和a没有直接关系,只要以a开头以b结束,其中的任意字符可以是1-3个之间的任意数。
位置确定
^确定行首位置:此字符后面的任意内容必须出现在行首
$ 确定行尾位置:此字符前面的任意内容必须出现在行尾
^$ 显示是否有空白行
[]匹配指定范围内的任意单个字符
[^]匹配指定范围外的任意单个字符
字符集合,使用是必须再用[]将其括起来,对应含义如下:
[:digit:] 数字
[:lower:] 小写字母
[:upper:] 大写字母
[:punct:] 标点符号
[:space:] 空白字符
[:alpha:] 所有字母
[:alnum:] 所有数字
如:新建一个临时文件inittab2,然后显示以数字结尾的行。
显示以一个或多个空白字符加数字结尾的行
\<或\b确定词首:其后面的任意字符必须作为单词首部出现
\>或\b确定词尾:前面的任意字符必须作为单词尾部出现
\<root\>精确匹配某个单词
分组:
\(\)
\(ab\)* ab可以出现1次,0次或任意次 ;*作用不是b本身,而是ab整体。
如:找该文件中出现ab的行和没有出现ab的行。
该分组是为了后面的引用提供一个参考。
后向引用:前面匹配什么,后面引用什么,看最后两行,便于理解。
\1: 引用第一个左括号与与之对应的右括号所包含的所有内容。
搜索0-9中以任意数字开头,然后以相同的数字结尾的所有行。
分析/etc/inittab文件中如下文本中前两行的特征(比如第2,3,4个数字相同)写出可以精确查找到类似两行的的模式:
11:1:wait:/etc/rc.d/rc 1
12:2:wait:/etc/rc.d/rc 2
知识点:
正则表达式(大多数文本处理工具都支持):
Basic Regular Expression 基本正则表达式
基本正则表达式(知识点):
字符匹配:
. 任意单个字符
[] 指定范围内的任意单个字符
[^] 指定范围外的任意单个字符
次数匹配:
* 其前的字符0次,1次或多次 ;即任意次
\? 其前的字符0次,或1次;即可有可无
\{m,n\} 匹配其前的字符,至少m次,至多n次(如无上限,n可以省略;如果最少是0次,m必须写成0,不得省略)
.* 任意长度的任意字符
锚定:
^ 锚定行首
$ 锚定行尾
\<,\b 锚定单词首部
\>,\b 锚定单词尾部
分组:
\(\)
\1,\2,\3,...
grep:使用基本正则表达式定义的模式来过滤文本的命令:
-i
-v
-o
--color
-E
-A # 匹配到,后面的#行也显示(After)
-B # 匹配到,前面的#行也显示(Before)
-C # 匹配到,前后的#行也显示(Context)
Extended Regular Expression 扩展正则表达式
(egrep=grep -E)
字符匹配(其含义与grep一样)
.
[]
[^]
次数匹配(部分与grep不同)
* 与grep相同
? 与grep含义相同,但无需加反斜线
+ 匹配其前字符至少一次 (相当于基本正则表达式grep中的\{1,\})
{m,n} 与grep含义相同,但无需加反斜线
位置锚定(与grep一样)
^
$
\<
\>
分组
() 分组,但无需反斜线
\1,\2,\3,...
或者
| 相当于or
搜索以至少一个空白字符开头的行
找出文件中/boot/grub/grub.conf中1-255中的整数
思路:加括号,使用或(图中后者正确,思考加括号区别)有括号:首尾进行或(中间的不计算)
前者:只要是数字,都给搜出来,之所以358被搜出来,其实358是1位后者2位被搜出来的
后者:使用了锚定,这就使用用于单词的确定查找法,只不过这其中的单词是必须是全数字-且符合范围,使用的数字被当作单个单词出现。其中el6就被当作一个单词,但是不是数字。
找出文件中ifconfig中1-255中的整数
找出文件中ifconfig中满足1-255中的地址(ABCDE)
一般写法:
优化写法:
找出文件中ifconfig中满足1-255中的有效的IP地址(ABC)
fgrep:fast grep(不支持正则表达式,所以执行快)
- grep及正则表达式
- grep 及 正则表达式
- grep及正则表达式
- grep及正则表达式
- grep及正则表达式
- grep及正则表达式
- Linux-grep及正则表达式
- linux grep 及正则表达式
- day06-grep及正则表达式
- grep 正则表达式及选项以及注意
- grep 正则表达式及选项以及注意
- 基础正则表达式及grep的使用
- 第七章、grep及正则表达式
- 快速掌握grep命令及正则表达式
- 快速掌握grep命令及正则表达式
- Linux学习----grep及正则表达式
- Linux:正则表达式及:grep工具
- linux笔记-grep及正则表达式
- 比赛组队-Java-2017百度秋招
- php获得刚插入数据的id 的 几种方法
- 布萌区块链:区块链和数字资产的“不解之缘”
- 抽奖系统的设计
- Android 之ButterKnife配置和使用详解
- grep及正则表达式
- android视频采集YUV420旋转角度算法
- 494. Target Sum
- 翻译的一篇关于学习编程语言的小文章
- trinity运行原理及常见报错(四)
- JSP 调试
- Android自定义控件——点赞效果(仿Twitter)
- icon、png网页开发中所需要的小图标
- HDU 1027 Ignatius and the Princess II (模拟题)