shell之正则表达式及grep命令

目录

一、正则表达式

1、正则表达式概述

2、基础正则表达式

3、扩展正则表达式

二、grep命令

1、查找特定字符grep -n 'the' test.txt 

2.利用中括号"[]"来查找集合字符

3. 查找行首“^”与行尾字符"$"

 4.查找任意一个字符".“与重复字符”*"

 5.查找连续字符范围"{}"


一、正则表达式

1、正则表达式概述

正则表达式又称正规表达式、常规表达式。在代码中常简写为regex、regexp或RE。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,简单来说,是一种匹配字符串的方法,通过一些特殊符号,实现快速查找、删除、替换某个特点字符串。

正则表达式是:由普通字符与元字符组成的文字模式

普通字符包括大小写字母、数字、标点符号及一些其他符号

元字符是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式

正则表达式一般用于脚本编程与文本编辑中

Linux 中常用的有两种正则表达式引擎

基本正则表达式:BRE

扩展正则表达式:ERE

文本处理工具 基础正则表达式 扩展正则表达式
vi编辑器            支持               \
grep            支持               \
egrep            支持            支持
sed            支持               \
awk            支持             支持


2、基础正则表达式

基础正职表达式是常用的正则表达式部分,常用的元字符及作用如下表示:

 元字符                                   作用
     \ 转义字符,用于取消特殊符号,如:\!  ,    \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

3、扩展正则表达式

扩展正则表达式是对基础正则表达式的扩充和深化

支持的工具有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命令使用正则表达式来搜索文本,并且把匹配的文本打印出来

格式: 

   grep  [options]  pattern  [file] 

   option表示选项,pattern表示匹配的模式。file表示一系列文件名。

常用选项:

-c        只打印匹配的文本行的次数,不显示文本内容。

-i         匹配时忽略字母大小写

-h        当搜索多个文件,不显示匹配文件名前缀

-l         只列出含义匹配的文本名,不显示其具体匹配的内容。

-n        列出所有匹配的文本行,并显示行号

-s        不显示关于不存在或无法读取文件的错误信息

-v        只显示不匹配的文本行,反向选择,显示与搜索字符串不相符的行。

-w        匹配整个单词

-x         匹配整个文本行

-r          递归搜索,不仅搜索当前目录,还有各级子目录

-E         开启扩展(extend)的正则表达式

--color=auto 可以将找到的关键词部分加上颜色的显示

 三、正则匹配

准备一个test.txt的文件演示

shell之正则表达式及grep命令_第1张图片

1、查找特定字符
grep -n 'the' test.txt 

 “test”  ’test‘单双引号都行  查找特定字符"the"所在位置。-n表示显示行号、-i表示不区分大小写

grep -in 'the' test.txt

shell之正则表达式及grep命令_第2张图片

 若反向选择,如查找不包括"the"字符的行,则需要通过grep命令的"-v"选项实现,并配合"-n"一起使用显示行号

shell之正则表达式及grep命令_第3张图片

2.利用中括号"[]"来查找集合字符

当查找“shirt”与“short”者两个字符时,两个字符均包括“sh”与“rt”。
同时查找到“shirt”与“short”这两个字符串
在[   ]  中无论有几个字符,都仅代表一个字符,也就是说“[  ]”表示匹配“i”或者“o”

 

 查找包含重复单个字符“oo”

shell之正则表达式及grep命令_第4张图片

 若查找"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"命令

3. 查找行首“^”与行尾字符"$"

基础正则表达式包含两个定位元字符:“^”(行首)与"$"(行尾)。如果想要查询以"the"字符串为行首的行,则可以通过" ^"元字符来实现。

查询以小写字母开头的行可以通过"^a-z"规则来过滤

查询大写字母开头的行则使用" ^A-Z"规则

若查询不以字母开头的行则使用" ^ [ ^a-zA-Z]"规则

 

 shell之正则表达式及grep命令_第5张图片

 

 "^“符号在元字符集合”[    ]“符号内外的作用时不一样的

在”[   ]“符号内表示反向选择,在”[     ]"符号外则代表定位行首。

反之,若想查找以某一特定字符结尾的行则可以使用 $定位符。

执行以下命令即可实现查询以小数点”.“结尾的行。

因为小数点".“在正则表达式中也是一个元字符,

所以需要用转义字符”"将具有特殊意义的字符转化成普通字符

shell之正则表达式及grep命令_第6张图片

当查询空白行时,执行"grep -n ‘^$’ test.txt"即可

 

 4.查找任意一个字符".“与重复字符”*"

在正则表达式中小数点"."也是一个元字执行

"grep -n ‘w…d’ test.txt"可以查找"w??d"的字符串

即共有四个字符,以w开头d结尾符

查询oo、ooo、oooo等资料,则需要使用  *  “  ”  元字符
“  ”代表的时重复零个或多个前面的单字符。“o”表示拥有零个(即空字符)或大于等于一个“o”的字符   因为允许空字符,所有执行“grep -n ‘o’ test.txt”  会将文本中的所有内容都输出打印。

shell之正则表达式及grep命令_第7张图片

查询任意数字所在行 

 

 5.查找连续字符范围"{}"

如果要查找三到五个的连续字符,这个时候就需要使用基础正则表达式中的限定范围的字符"{}“。因为”{}“在Shell中具有特殊意义,所以在使用”{}“字符时,需要利用转义字符”“,将”{}"字符转换成普通字符

查询两个o的字符

shell之正则表达式及grep命令_第8张图片

查询以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"字符串的意思

 

你可能感兴趣的:(正则表达式)