当前位置:网站首页>shell正则表达式,三剑客grep命令
shell正则表达式,三剑客grep命令
2022-08-08 13:56:00 【AKA|布鲁克林欧神仙】
目录
三,基础正则表达式常见元字符:(支持的工具,grep,egrep,sed,awk)
一,正则表达式
1,正则表达式定义
正则表达式,又称正规表达式,常规表达式
- 正则表达式通常用于判断语句中,用来检查某一字符串是否满足某一格式
- 正则表达式是由普通字符和云字符组成的
- 普通字符包括大小写字母,数字,标点符号及其他符号
- 元字符是指在正则表达式中,具有特殊意义的专用字符,可以用来规定前导字符(即位于元字符前面的字符)在目标对象中的出现方式。
linux中常用的有两种正则表达式引擎
基础正则表达式 BRE
扩展正则表达式 ERE
二,grep命令
选项 | 含义 |
-w | 表示精确匹配 |
-E | 开启扩展的正则表达式 |
-c | 计算找到字符串"的次数 |
-i | 忽略大小写的不同 |
-o | 只显示被模式匹配到的字符串 |
-v | 反向选择, |
-n | 输出行号 |
案例
三,基础正则表达式常见元字符:(支持的工具,grep,egrep,sed,awk)
特殊字符
元字符 | 作用 |
^ | 匹配字符串开始的位置 例子:^a、^the、^# |
$ | 匹配字符串结束的位置 例:例: wordKaTeX parse error: Expected group after '^' at position 3: 、$^匹配空行 |
\ | 转义字符,用于取消特殊符号的含义,例:!、\n等 |
. | 匹配出之外的任意的一个字符 |
* | 匹配前面表达式0次或者多次,例:goo*d、go.*d |
[list] | 匹配list列表中的一个字符,例: go[ola]d,[abc]、[a-z]、[a-z0-9] |
[^list] | 匹配任意不再list列表中的一个字符 例: [^a-z]、[^0-9]、[^A-Z0-9] |
\{n\} | 匹配前面的子表达式n次,例:qo\{2\}d、'[O-9] \{2\ }'匹配两位数字 |
\{n,\} | 匹配前面的子表达式不少于n次,例: go\{2,\}d、'[0-9]\{2,\}'匹配两位及两位以上数字 |
\{n,m\} | 匹配前面的子表达式n到m次,例: go\{2,3\)d、' [0-9]\{2,3\} '匹配两位到三位数字 |
- 注:egrep、awk使用{n}、{n, }、{n, m}匹配时“{}"前不用加"\”
- egrep -E -n 'wo{2}d' test.txt //-E 用于显示文件中符合条件的字符
- egrep -E -n 'wo{2,3}d' test.txt
四,扩展正则表达式元字符
+ | 作用:重复一个或者一个以上的前一个字符 示例:执行“egrep -n 'wo+d' test.txt”命令,即可查询"wood" "woood" "woooooood"等字符串 | |
---|---|---|
? | 用:零个或者一个的前一个字符 示例:执行“egrep -n 'bes?t' test.txt”命令,即可查询“bet”“best”这两个字符串 | |
| | 作用:使用或者(or)的方式找出多个字符 示例:执行“egrep -n 'of|is|on' test.txt”命令即可查询"of"或者"if"或者"on"字符串 | |
() |
| |
()+ | 作用:辨别多个重复的组 示例:“egrep -n 'A(xyz)+C' test.txt”。该命令是查询开头的"A"结尾是"C",中间有一个以上的"xyz"字符串的意思 |
五,正则使用案例
1,查找特定字符
查找特定字符非常简单,如执行以下命令即可从test.txt文件中查找出特定字符“the”所在位置。其中“-n”表示显示行号、“-i”表示不区分大小写。命令执行后,符合匹配标准的字符, 字体颜色会变为红色
若反向选择,如查找不包含“nologin”字符的行,则需要通过 grep 命令的“-v”选项实现,并配合“-n”一起使用显示行号。
2,利用中括号“[]”来查找集合字符
想要查找“shirt”与“short”这两个字符串时,可以发现这两个字符串均包含“sh” 与“rt”。此时执行以下命令即可同时查找到“shirt”与“short”这两个字符串。“[]”中无论有几个字符,都仅代表一个字符,也就是说“[io]”表示匹配“i”或者“o”。
若要查找包含单个重复字符“oo”时,只需要执行以下命令即可。
若查找“oo”前面不是“w”的字符串,只需要通过集合字符的反向选择“[^]”来实现该目的,如执行“grep –n‘[^w]oo’test.txt”命令表示在 test.txt 文本中查找“oo” 前面不是“w”的字符串
在上述命令的执行结果中发现“woood”与“wooooood”也符合匹配规则,二者均包含“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”字符串时出现了很多包含“the”的行,如果想要查询以“the”字符串为行首的行,则可以通过“^”元字符来实现。
查询以小写字母开头的行可以通过“^[a-z]”规则来过滤,查询大写字母开头的行则使用“^[A-Z]”规则,若查询不以字母开头的行则使用“^[^a-zA-Z]”规则
“^”符号在元字符集合“[]”符号内外的作用是不一样的,在“[]”符号内表示反向选择,在“[]”符号外则代表定位行首。反之,若想查找以某一特定字符结尾的行则可以使用“$”定位符。例如,执行以下命令即可实现查询以小数点(.)结尾的行。因为小数点(.) 在正则表达式中也是一个元字符(后面会讲到),所以在这里需要用转义字符“\”将具有特 殊意义的字符转化成普通字符。
当查询空白行时,执行“grep -n '^$' zzcc.txt 命令即可
4,查找任意一个字符“.” 与重复字符“*”
前面提到,在正则表达式中小数点(.)也是一个元字符,代表任意一个字符。例如, 执行以下命令就可以查找“w??d”的字符串,即共有四个字符,以 w 开头 d 结尾
在上述结果中,“wood”字符串“w..d”匹配规则。若想要查询oo、ooo、ooooo等资料,则需要使用星号(*)元字符。但需要注意的是,“*”代表的是重复零个或多个前面的单字符。“o*”表示拥有零个(即为空字符)或大于等于一个“o”的字符,因为允许空字符,所以执行“grep–n‘o*’test.txt”命令会将文本中所有的内容都输出打印。如果是“oo*”,则第一个 o 必须存在,第二个 o 则是零个或多个 o,所以凡是包含 o、oo、ooo、ooo,等的资料都符合标准。同理,若查询包含至少两个 o 以上的字符串,则执行“grep –n‘ooo*’ test.txt”命令即可。
查询以w开头d结尾,中间包含至少一个o的字符串,执行以下命令即可实现。
查询以w开头d结尾,中间的字符可有可无的字符串
查询任意数字所在行
5,查询连续字符范围“[]”
在上面的示例中,我们使用“.”与“*”来设定零个到无限多个重复的字符,如果想要限制一个范围内的重复的字符串该如何实现呢?例如,查找三到五个 o 的连续字符,这个时候就需要使用基础正则表达式中的限定范围的字符“{}”。因为“{}”在Shell中具有特殊 意义,所以在使用“{}”字符时,需要利用转义字符“\”,将“{}”字符转换成普通字符。 “{}”字符的使用方法如下所示。
查询两个oo的字符
查询以w开头以d结尾,中间包含2-5个0的字符串
查询以 w 开头以 d 结尾,中间包含 2 以上 o 的字符串。
边栏推荐
猜你喜欢
连锁小酒馆第一股,海伦司能否梦圆大排档?
keil5——安装教程附资源包
你是什么时候对深度学习失去信心的?
KMP Media Group South Africa implemented a DMS (Document Management System) to digitize the process, employees can again focus on their actual tasks, providing efficiency
《预训练周刊》第56期:长文本理解、即时问答、掩码自监督
Code Casual Recording Notes_Dynamic Programming_322 Change Exchange
从零开始,如何拥有自己的博客网站【华为云至简致远】
一桩事先张扬的网红书店倒闭案
HackTheBox | Previse
[Redis] Redis installation and use of client redis-cli (batch operation)
随机推荐
良心到难以置信的网站推荐第7期丨全程干货
暗恋云匹配匿名交友聊天系统开发
Tsinghua | GLM-130B: An Open Bilingual Pre-training Model
作为一个十年卷王,告诫你们年轻人应该如何才能认清自己的价值
serialize 序列化原生方法
如何对用户输入进行校验
零基础入门华为云数据库RDS【华为云至简致远】
【小码匠自习室】CSP-J/S复试高分秘诀经验分享
Full of dry goods, Yu Jingxin class of the Institute of Information Technology, Chinese Academy of Sciences will help you get academic research and thesis writing skills
基于ModelArts的StyleGAN3生成高清图丨【华为云至简致远】
Kotlin系列之let、with、run、apply、also函数的使用
Flink1.15 组件RPC通信过程概览图
设计一个跨平台的即时通讯系统(采用华为云ECS服务器作为服务端 )【华为云至简致远】
【系统设计】S3 对象存储
基于Nodejs的医生预约平台的设计和实现
【低代码】1405- 浅谈低代码平台远程组件加载方案
Implementation of FIR filter based on FPGA (1) - using fir1 function design
poj3744 Scout YYF I
flink知识
window停掉指定端口的进程