shell之正则表达式及三剑客grep命令

本文深入介绍了正则表达式的概念、元字符及其在基础和扩展模式下的应用。详细讲解了grep命令的使用,包括基础选项和正则表达式的结合使用,通过多个案例展示了如何在文本中高效地搜索和过滤信息。同时,对比了grep、egrep和sed、awk中正则表达式的差异。
摘要由CSDN通过智能技术生成

一、正则表达式概述

什么是正则表达式?

正则表达式是一种描述字符串匹配规则的重要工具

1、正则表达式定义

正则表达式,又称正规表达式、常规表达式

  • 使用字符串描述、匹配一系列符合某个规则的字符串

正则表达式

  • 普通字符: 大小写字母、数字、标点符号及一些其它符号
  • 元字符: 在正则表达式中具有特殊意义的专用字符

正则表达式的层次分类

  • 基础正则表达式
  • 扩展正则表达式

Linux三剑客(grep、sed、awk)支持的正则表达式

  • shell是不支持正则表达式的(shell支持的是通配符)。shell中的正则表达式只有个别命令支持的,一般常用的是Linux三剑客
支持正则的shell命令正则类型
grep默认使用基本正则表达式(BRE)(要使用扩展正则需要加转义字符)
egrep 或grep -E使用扩展的正则表达式(ERE)
sed默认使用基本正则表达式(BRE)
awk使用扩展正则表达式(ERE)

2 基础正则表达式的元字符

基础正则表达式是常用的正则表达式部分

2.1 匹配字符

  • \ : 表示转义字符,去掉特殊符号的特殊含义

  • \n : 匹配换行符

  • \t : 匹配制表符

  • \w : 匹配单词字符(单词字符:a-z,A-Z,0-9,_ )

  • \W : 匹配非单词字符

  • \S : 匹配非空白字符

  • \s : 匹配空白字符

  • \d : 匹配数字

  • \D : 匹配非数字

  • . : 表示匹配任意单个字符(默认情况下,. 无法匹配换行符)

2.2 中括号表达式

字符组: 普通中括号包围的字符组,表示某个单个字符匹配中括号内的任意字符即匹配成功

  • x[abc]z : 可以匹配包含“xaz”、“xbz”、“xcz”的字符串
  • 取反表示法: 中括号内开头使用 ^ ,表示只要不是中括号内的字符就匹配
    • x[ ^abc]z : 可以匹配包含 “xdz”、“xez” 等字符串,但不能匹配包含“xaz”、“xbz”、“xcz”的字符串

范围表示法

  • [a-z]: 表示任意单个小写字母

    • [ ^a-z] : 匹配非小写字母的其它任意字符串
  • [A-Z] : 表示任意单个大写字符

  • [0-9] : 表示任意单个数字

    • 注意:[0-59],表示匹配0、1、2、3、4、5、9,而不是0-59中间的数值
  • [a-z0-9A-Z] : 表示任意字母或数字

  • [a-z0-9A-Z_] : 表示任意字符、数字或下划线,也就是匹配单个字符

特殊的元字符在中括号中匹配

  • 想要在中括号中匹配: ^ ,需要将其放在 中括号非开头的位置 ,如:[a^]
  • 想要在中括号中匹配: - ,需要将其放在 开头位置或结尾位置 ,如:[abc-]、[-abc]
  • 想要在中括号中匹配: ] ,需要将其放在 开头位置 ,如:[]abc]

2.3 位置匹配(锚定)

只匹配位置,不匹配字符,所以不会消耗字符数量,也称为零宽断言

  • ^ : 匹配行首
  • $ : 匹配行尾

2.4 量词(重复匹配次数)

  • \{m\} : 表示匹配前一个字符或前一个子表达式m次

    • \{m,n\} : (m<n)表示匹配前一个字符或前一个字表达式最少m次,最多n次

    • \{m,\} : 表示匹配前一个字符或前一个子表达式至少m次

    • \{,n\} : 表示匹配前一个字符或前一个字表达式最多n次(匹配0次也算是成功)

  • * 表示前一个字符或前一个子表达式匹配0次或多次,等价于:{0,}

    • .* : 匹配任意长度的任意字符

**注意:这些量词均为贪婪匹配模式,就是尽可能的去匹配符合条件的字符,例如:ab. *c 去匹配字符串:abbcdecfc,其中. * 部分匹配的将是bcdecf **

2 扩展正则表达式的元字符

2.1 扩展常用的量词

  • ? : 表示匹配前一个字符或前一个子表达式0或1次,等价于:{0,1}或者{,1}

  • +: 表示匹配前一个字符或前一个子表达式1次或多次,就是最少一次,等价于:{1,}

2.2 二选一表达式

竖线 | 分隔左右两个正则子表达式,表示匹配任何一个即可,即a|b表示:a或者b,在结果上等价[ab];但是:[0-5] |\sa 表示0、1、2、3、4、5 或者 “ a”,这种转化不了为[]的形式。

使用二选一子表达式需要注意:

  • 二选一元字符优先级很低,所以abc|def 表示的是abc或者def,等价于:(abc)|(def),而不是ab(c|d)ef。

2.3 分组捕获和反向引用

使用小括号()包围一部分正则表达式,这部分正则表达式即成为一个分组整体,也称为一个子表达式。

根据左括号的位置决定第几个分组

  • 例如:(abc)def 、([a-d]){3}、 ([0-9]abc(def){2}(hgi))。

分组后可以使用\N 来反向引用对应的分组匹配结果,N是1-9的正整数,\1表示第一个分组表达式的匹配结果,\2表达第二个分组表达式的匹配结果。

  • 注意:反向引用引用的是分组匹配后的结果,不是分组表达式

  • 例如:正则表达式:(abc|def) and \1xyz 可以匹配字符串“abc and abcxyz ” 或“def and defxyz”,但是不能匹配“abc and defxyz” 或 “def and abcxyz”

二、grep命令的使用

1、grep命令简介

grep是一种强大的文本搜索工具,它能使用正则表达式,并把匹配的行打印出来。

格式

grep  [options]  pattern   [file]

options表示:选项; pattern 表示:匹配的的表达式 ; file 表示:文件名

例如:grep  -i  "root" /etc/passwd

2、常用选项

常用选项功能
-n列出所匹配的文本行,并显示行号
-i匹配时忽略字符大小写
-v反向匹配,匹配的字符串与搜索的不相符
-w精确匹配。匹配整个单词
-o只显示匹配的部分
-c显示匹配内容的行数

3、grep 的选项使用案例

案例:过滤出/etc/passwd中的root,并添加行号(-n)

在这里插入图片描述

案例:过滤出/etc/passwd 中的FTP,不区分大小写(-i)

在这里插入图片描述

案例:过滤/etc/passwd 中的不包含root的行,并且显示行号(-v)

在这里插入图片描述

在这里插入图片描述

案例:精准搜索单词,只匹配到单词所在的行(-w)

在这里插入图片描述

案例:将匹配到的单词罗列出来(-o)

在这里插入图片描述

案例:显示匹配的内容的行数(-c)

在这里插入图片描述

三、grep加上正则使用案例

1、中括号表达式案例

案例1:搜索既可以查找shirt也可以查找short的单词所在行

在这里插入图片描述

案例2:搜索oo前面不是大小写字母开头的行

在这里插入图片描述

案例3:查找包含数字的行

在这里插入图片描述

2、位置锚定案例

案例1:搜索以.结尾的行

在这里插入图片描述

案例2:搜索以y开头的行

在这里插入图片描述

3、量词案例

案例1:搜索2个oo的行

在这里插入图片描述

为了匹配了6个o,但是要求搜索的是2个o?

答:因为正则表达式是一行一行的检索的,表达式是2个o,搜索的内容时一个很长的字符串。
先拿表达式中的第一个字符与字符串匹配,匹配不到,进行下一个匹配,最后匹配到了mgoooooood中的o
匹配成功,然后匹配第二个o,也匹配成功,然后就会将匹配的两个字符消耗掉,再继续重新匹配到下一个字符
最后消耗掉三次,也就是6个o,第7个o虽然匹配成功,但是第8个字符不是o,所以不会匹配成功。

案例2:查看o这个字符,最少出现3次,最大出现6次

在这里插入图片描述

案例3:查找o这个字符,最少出现5次的行

在这里插入图片描述

案例:特殊的量词案例

在这里插入图片描述

4、二选一表达式和分组案例

案例1:搜索以y开头或者以d结尾的行

在这里插入图片描述

案例2:搜索shirt和short所在的行

在这里插入图片描述

四、总结

正则元字符描述grepegrepsedawk
\转义符,将特殊字符进行转义,忽略其特殊意义支持支持支持支持
^匹配行首支持支持支持支持
$匹配行尾支持支持支持支持
.匹配除换行符\n 之外的任意单个字符支持支持支持支持
[]匹配包含在[字符]之中的任意一个字符支持支持支持支持
[^]匹配[ ^z字符]之外的任意一个字符支持支持支持支持
[-]匹配 []中指定范围的任意一个字符,要写成递增支持支持支持支持
*匹配前导字符或子表达式0次或多次支持支持支持支持
匹配前导字符或子表达式0次或1次不支持(加\)支持不支持(加\)支持
+匹配前导字符或子表达式1次或多次不支持(加\)支持不支持(加\)支持
()匹配表达式,创建一个用于匹配的字串不支持(加\)支持不支持(加\)支持
{n}匹配前导字符或子表达式n次,可以为0不支持(加\)支持不支持(加\)支持
{n,}匹配前导字符或子表达式至少n次不支持(加\)支持不支持(加\)支持
{n,m}匹配前导字符或子表达式,最少匹配n次,最低匹配m次,n<=m不支持(加\)支持不支持(加\)支持
|交替匹配| 两边的任意一项不支持(加\)支持不支持(加\)支持
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值