目录
一、正则表达式
1、正则表达式概述
2、基础正则表达式
3、扩展正则表达式
二、grep命令
1、查找特定字符grep -n 'the' test.txt
2.利用中括号"[]"来查找集合字符
3. 查找行首“^”与行尾字符"$"
4.查找任意一个字符".“与重复字符”*"
5.查找连续字符范围"{}"
正则表达式又称正规表达式、常规表达式。在代码中常简写为regex、regexp或RE。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,简单来说,是一种匹配字符串的方法,通过一些特殊符号,实现快速查找、删除、替换某个特点字符串。
正则表达式是:由普通字符与元字符组成的文字模式
普通字符包括大小写字母、数字、标点符号及一些其他符号
元字符是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式
正则表达式一般用于脚本编程与文本编辑中
Linux 中常用的有两种正则表达式引擎
基本正则表达式:BRE
扩展正则表达式:ERE
文本处理工具 | 基础正则表达式 | 扩展正则表达式 |
vi编辑器 | 支持 | \ |
grep | 支持 | \ |
egrep | 支持 | 支持 |
sed | 支持 | \ |
awk | 支持 | 支持 |
基础正职表达式是常用的正则表达式部分,常用的元字符及作用如下表示:
元字符 | 作用 |
\ | 转义字符,用于取消特殊符号,如:\! , \n |
^ | 匹配字符串开始的位置,如:^world 匹配以world 开头的行 |
$ | 匹配字符串结束的位置,如:world$ 匹配以world 结尾的行 |
. | 匹配除\n (换行)之外的任意的一个字符 |
* | 匹配前面子表达式0次或者多次 |
[list] | 匹配list列表中的一个字符,如:[ 0-9 ] 匹配任意一位数字 |
[ ^list ] | 匹配任意不在list列表中的一个字符,如:[^0-9] 匹配任意一位非数字字符 |
\{n,\} | 匹配前面的子表达式n次,如:[0-9]{ 2\} 匹配两位数字 |
\{n,\} | 匹配前面的子表达式不少于n次,如:[0-9]\{2\} 表示两位及两位以上数字 |
\{n,m\} | 匹配前面的子表达式n到m次,如:[ a-z ]\ {2,3\} 匹配两到三位的小写字母 |
注意egrpep ,awk使用{n}、 {n,} {n,m} 匹配时“{}”钱不要加 “\”
egrep -E -n 'wo{2}d' test.txt -E用于显示文件中符合条件的字符
egrep -E -n 'wo{2,3}d' test.txt
扩展正则表达式是对基础正则表达式的扩充和深化
支持的工具有egerp和awk
扩展正职表达式元字符
元字符 | 作用 |
+ | 匹配前面子表达式1次以上,如:go+d,将匹配至少一个0 |
? | 匹配前面子表达式0次或者1次,如:go?d,将匹配gd或god |
() | 将括号中的字符串作为一个整体,如:g(oo)+d,将匹配。整体1次以上,如good,goooood等 |
| | 以或的方式匹配字条串,如:good l great,将匹配good或则great |
定位符
^匹配输入字符串开始的位置
$匹配输入字符串结尾的位置
非打印字符
\n 匹配一个换行符
\r 匹配一个回车符
\t匹配一个制表符
grep命令使用正则表达式来搜索文本,并且把匹配的文本打印出来
格式:
grep [options] pattern [file]
option表示选项,pattern表示匹配的模式。file表示一系列文件名。
常用选项:
-c 只打印匹配的文本行的次数,不显示文本内容。
-i 匹配时忽略字母大小写
-h 当搜索多个文件,不显示匹配文件名前缀
-l 只列出含义匹配的文本名,不显示其具体匹配的内容。
-n 列出所有匹配的文本行,并显示行号
-s 不显示关于不存在或无法读取文件的错误信息
-v 只显示不匹配的文本行,反向选择,显示与搜索字符串不相符的行。
-w 匹配整个单词
-x 匹配整个文本行
-r 递归搜索,不仅搜索当前目录,还有各级子目录
-E 开启扩展(extend)的正则表达式
--color=auto 可以将找到的关键词部分加上颜色的显示
三、正则匹配
准备一个test.txt的文件演示
“test” ’test‘单双引号都行 查找特定字符"the"所在位置。-n表示显示行号、-i表示不区分大小写
grep -in 'the' test.txt
若反向选择,如查找不包括"the"字符的行,则需要通过grep命令的"-v"选项实现,并配合"-n"一起使用显示行号
当查找“shirt”与“short”者两个字符时,两个字符均包括“sh”与“rt”。
同时查找到“shirt”与“short”这两个字符串
在[ ] 中无论有几个字符,都仅代表一个字符,也就是说“[ ]”表示匹配“i”或者“o”
查找包含重复单个字符“oo”
若查找"oo"前面不是"w"的字符串,只需要通过集合字符的反向选择"[^]"来实现该目的
在上述命令的执行结构发现”woood”与“whoooood”也符合匹配规则,二者均包含"w".其实通过执行结果就可以看出,符合匹配标准的字符加粗显示
“#woood #”中加粗显示的是“ooo”,而“oo”前面的“o”是符合匹配规则的。同理“#woooooood #” 也符合匹配规则。
若不希望“oo”前面存在小写字母可以使用"grep -n ‘[ ^a-z]oo’ test.txt"实现。
其中,“a-z”表示小写字母,大写字母则通过“A-Z”表示。
查找包含数字的行可以通过"grep -n ‘[0-9]’ test.txt"命令
基础正则表达式包含两个定位元字符:“^”(行首)与"$"(行尾)。如果想要查询以"the"字符串为行首的行,则可以通过" ^"元字符来实现。
查询以小写字母开头的行可以通过"^a-z"规则来过滤
查询大写字母开头的行则使用" ^A-Z"规则
若查询不以字母开头的行则使用" ^ [ ^a-zA-Z]"规则
"^“符号在元字符集合”[ ]“符号内外的作用时不一样的
在”[ ]“符号内表示反向选择,在”[ ]"符号外则代表定位行首。
反之,若想查找以某一特定字符结尾的行则可以使用 $定位符。
执行以下命令即可实现查询以小数点”.“结尾的行。
因为小数点".“在正则表达式中也是一个元字符,
所以需要用转义字符”"将具有特殊意义的字符转化成普通字符
当查询空白行时,执行"grep -n ‘^$’ test.txt"即可
在正则表达式中小数点"."也是一个元字执行
"grep -n ‘w…d’ test.txt"可以查找"w??d"的字符串
即共有四个字符,以w开头d结尾符
查询oo、ooo、oooo等资料,则需要使用 * “ ” 元字符
“ ”代表的时重复零个或多个前面的单字符。“o”表示拥有零个(即空字符)或大于等于一个“o”的字符 因为允许空字符,所有执行“grep -n ‘o’ test.txt” 会将文本中的所有内容都输出打印。
查询任意数字所在行
如果要查找三到五个的连续字符,这个时候就需要使用基础正则表达式中的限定范围的字符"{}“。因为”{}“在Shell中具有特殊意义,所以在使用”{}“字符时,需要利用转义字符”“,将”{}"字符转换成普通字符
查询两个o的字符
查询以w开头以d结尾,中间包含2-5个o的字符
查询以w开头以d结尾,中间报班两个或两个以上o的字符串
四、扩展正则表达式
通常情况下会使用基础正则表达式就已经足够了,但有时为了简化整个指令,需要使用范围更广的扩展正则表达式。例如使用基础这个则表达式查询除文件中空白行与行首为"#"之外的行,使用grep -v ‘^$’ test.txt |grep -v ’ ^#‘即可实现。这里需要使用管道命令来搜索两次。如果使用扩展正则表达式,可以简化为egrep -v ’ ^ $ | ^#’ test.txt,其中单引号中的管道符号表示或者(or)
此外,grep命令仅支持基础正则表达式,如果使用扩展正则表达式,需要使用egrep或awk命令。egrep命令与grep命令的用大基本相似。egrep命令是收缩文件获得模式,使用该命令可以搜索文件获得模式,使用该命令可以搜索文件中的任意字符串和符号,也可以收缩一个或多个文件的字符串,一个提示符一课时单个字符、一个字符串、一个字或一个句子。
扩展正则表达式常见元字符
+
作用:重复一个或者一个以上的前一个字符
示例:执行"egrep -n 'wo+d' test.txt"命令,即可查询"wood" "woood" "wooood"等字符串
?
作用:零个或者一个的前一个字符
示例:执行"egrep -n 'bes?t' test.txt"命令,即可查询“bet”“best”这两个字符串
|
作用:使用或者(or)的方式找出多个字符
示例:执行"egrep -n 'of|is|on' test.txt"命令即可查询"of"或者"if"或者"on"字符串
()
作用:查找“组”字符串
示例:"egrep -n 't(a|e)st' test.txt"。"tast"与"test"因为这两个单词的"t"与"st"是重复的,所以将"a"与"e" 列于“()”符号当中,并以"|"分隔,即可查询"tast"或者"test"字符串
()+
作用:辨别多个重复的组
示例:"egrep -n 'A(xyz)+C' test.txt"。该命令是查询开头的"A"结尾是"C",中间有一个以上的"xyz"字符串的意思