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

一、正则表达式概述

什么是正则表达式?

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

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不支持(加\)支持不支持(加\)支持
|交替匹配| 两边的任意一项不支持(加\)支持不支持(加\)支持

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/37832.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

判断推理 -- 图形推理 -- 位置规律

一组图&#xff1a;从前往后找规律。 二组图&#xff1a;从第一组图找规律&#xff0c;第二组图应用规律。 九宫格&#xff1a; 90%横着看找规律&#xff0c;第一行找规律&#xff0c;第二行验证规律&#xff0c;第三行应用规律。 所有有元素组成都是线&#xff0c;三角形&…

面试热题(验证二叉搜索树)

给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉树 二叉树满足以上3个条件&#xff0c…

spark的使用

spark的使用 spark是一款分布式的计算框架&#xff0c;用于调度成百上千的服务器集群。 安装pyspark # os.environ[PYSPARK_PYTHON]解析器路径 pyspark_python配置解析器路径 import os os.environ[PYSPARK_PYTHON]"D:/dev/python/python3.11.4/python.exe"pip inst…

喜盈门、梦百合竞相入局,智能床垫起风了

配图来自Canva可画 现代人的生活压力普遍大&#xff0c;熬夜、失眠是常有的事&#xff0c;提高睡眠质量十分的重要。近些年来&#xff0c;市面上出现了许多辅助睡眠的产品&#xff0c;比如香薰、褪黑素、蒸汽眼罩、降噪耳塞、助眠枕、睡眠监测app等助眠神器。可以说为了睡个好…

【CLion + ROS2】在 clion 中编译调试 ros2 package

目录 0 背景1. 命令行编译 ros2 package2. 使用 clion 打开 ros2 工程3. 使用 clion 编译整个 ros2 工程3.1 使用 clion 的 external tool 配置 colcon build3.2 开始编译 dev_ws 工程3.3 编译结果&#xff1a; 4. 调试单独的 ros2 package4.1 创建 ros2 package 的独立的 colc…

【Git】版本控制器详解之git的概念和基本使用

版本控制器git 初始Gitgit的安装git的基本使用初始化本地仓库配置本地仓库三区协作添加---add修改文件--status|diff版本回退--reset撤销修改删除文件 初始Git 为了能够更⽅便我们管理不同版本的⽂件&#xff0c;便有了版本控制器。所谓的版本控制器&#xff0c;就是⼀个可以记…

基于ssm+vue的新能源汽车在线租赁管理系统源码和论文PPT

基于ssmvue的新能源汽车在线租赁管理系统源码和论文PPT010 开发环境&#xff1a; 开发工具&#xff1a;idea 数据库mysql5.7(mysql5.7最佳) 数据库链接工具&#xff1a;navcat,小海豚等 开发技术&#xff1a;java ssm tomcat8.5 摘 要 随着科学技术的飞速发展&#xff0…

Ajax及前端工程化

Ajax&#xff1a;异步的js与xml。 作用&#xff1a; 1、通过ajax给服务器发送数据&#xff0c;并获得其响应的数据。 2、可以在不更新整个网页的情况下&#xff0c;与服务器交换数据并更新部分网页的技术。 一、同步与异步 二、原生Ajax 1、准备数据地址 2、创建XMLHttpReq…

SCSS的基本用法

1、声明变量 $ 声明变量的符号 $ 下面这张图左半部分是scss的语法&#xff0c;右半部分是编译后的css。&#xff08;整篇文章皆是如此&#xff09; 2、默认变量 !default sass 的默认变量仅需要在值后面加上 !default 即可。 如果分配给变量的值后面添加了 !default 标志…

Qt 杂项(Qwt、样式等)

Qt隐藏窗口边框 this->setWindowFlags(Qt::FramelessWindowHint);Qt模态框 this->setWindowModality(Qt::ApplicationModal);QLable隐藏border 代码中设置 lable->setStyleSheet("border:0px");或者UI中直接设置样式&#xff1a;“border:0px” Qwt开源…

JS实现树形结构、一维数组以及map之间的转换

const treeData[ {id:1, name:中国, children:[ {id:11,name:河南省,children:[{id:111,name:南阳市,children:[{id:1111,name:淅川县,children:null}]},{id:112,name:郑州市,children:[{id:1121,name:中牟县,children:null}]}] }, {id:22,name:广东省,children:[{id:221,name:…

c++中的多态

文章目录 1.多态的概念1.1概念 2.多态的定义及实现2.1多态的构成条件2.2虚函数2.3虚函数的重写2.4 C11 override 和 final2.5 重载、覆盖(重写)、隐藏(重定义)的对比 3. 抽象类3.1概念3.2接口继承和实现继承 4.多态的原理4.1虚函数表4.2多态原理分析4.3 动态绑定与静态绑定 5.单…

学习笔记整理-面向对象-03-构造函数

一、构造函数 1. 用new调用函数的四步走 new 函数();JS规定&#xff0c;使用new操作符调用函数会进行"四步走"&#xff1a; 函数体内会自动创建出一个空白对象函数的上下文(this)会指向这个对象函数体内的语句会执行函数会自动返回上下文对象&#xff0c;即使函数没…

HDMI接口的PCB布局布线要求

高清多媒体接口&#xff08;High Definition Multimedia Interface&#xff09;&#xff0c;简称&#xff1a;HDMI&#xff0c;是一种全数字化视频和声音发送接口&#xff0c;可以发送未压缩的音频及视频信号。随着技术的不断提升&#xff0c;HDMI的传输速率也不断的提升&#…

brew+nginx配置静态文件服务器

背景 一下子闲下来了&#xff0c;了解的我的人都知道我闲不下来。于是&#xff0c;我在思考COS之后&#xff0c;决定自己整一个本地的OSS&#xff0c;实现静态文件的访问。那么&#xff0c;首屈一指的就是我很熟的nginx。也算是个小复习吧&#xff0c;复习一下nginx代理静态文…

解决生成式AI落地之困,亚马逊云科技提供完整解决方案

生成式AI技术无疑是当前最大的时代想象力之一。 资本、创业者、普通人都在涌入生成式AI里去一探究竟&#xff1a;“百模大战”连夜打响&#xff0c;融资规模连创新高&#xff0c;各种消费类产品概念不断涌现……根据Bloomberg Intelligence 的报告&#xff0c;2022年生成式AI 市…

文件操作/IO

文件 文件是一种在硬盘上存储数据的方式&#xff0c;操作系统帮我们把硬盘的一些细节都封装起来了&#xff0c;程序员只需要了解文件相关的接口即可&#xff0c;相当于操作文件就是间接的操作硬盘了 硬盘用来存储数据&#xff0c;和内存相比硬盘的存储空间更大&#xff0c;访问…

使用FTP文件传输协议的潜在风险

数据&#xff08;事实&#xff0c;数字&#xff0c;价值&#xff09;是当今业务运行的核心要素。但是&#xff0c;如果数据没有得到有效的存储和传输&#xff0c;它们就会成为阻碍业务发展的障碍。如果企业不能及时地把数据送到合适的地方&#xff0c;就会造成严重的经济损失。…

【Linux】Shell脚本之流程控制语句 if判断、for循环、while循环、case循环判断 + 实战详解[⭐建议收藏!!⭐]

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…