#Linux杂记# grep 查找命令常用选项大全(二)

news2024/7/6 19:11:38

前面一篇文章,简单介绍了grep 查找命令的简单用法。链接:#Linux杂记# grep 查找命令常用选项大全(一)

本篇,注重讲述 grep 与 正则表达式的配合使用。在grep + RE 结合使用时,需要添加选项 “ -E ”。

先展示文件 grep.log 中的文本内容:

systemhoveveuvievevhveriloghovhsviesystemweeverilog
nldsveve 3234 s "test start"hlveuvvbe
systemmlvevbvvvfdoivhdov2334bcbdv4f+verilog23k_13#nsiuvg2232
systemsystemlvevbvvvfdoivhdov2334bcbdv4f+verilog23k_13#nsiuvg2232
vkvevhiu43876fiw28yjd24jbsdu9_+iuegr+wefyuwi
system7verilog
system7&verilog

we212system4verilog
##1f$$##www.baidu.com.www.qq.com%%

1. grep+元字符

  • .:匹配任意单个字符,但不能匹配换行符\n

例子:

[my_basic_helloworld_1]grep -E "system.verilog" grep.log  -i
system7verilog
we212system4verilog   // system和verilog之间只允许有一个字符存在,匹配成功!
  • *:匹配前面那个字符0或多次

例子:

[my_basic_helloworld_1]grep -E "system.*verilog" grep.log  -i
systemhoveveuvievevhveriloghovhsviesystemweeverilog // 中间匹配任意多个字符
systemmlvevbvvvfdoivhdov2334bcbdv4f+verilog23k_13#nsiuvg2232 // 中间匹配任意多个字符
systemsystemlvevbvvvfdoivhdov2334bcbdv4f+verilog23k_13#nsiuvg2232 // 中间匹配任意多个字符
system7verilog   // 中间匹配任意1个字符
system7&verilog // 中间匹配任意2个字符
we212system4verilog
  • ?:匹配前面那个字符0或一次

例子: 

[ICer@IC_EDA /home/ICer/icer_pjs/my_basic_helloworld_1]grep -E "system.?verilog" grep.log  -i
system7verilog  // 中间匹配1个任意字符,  2个任意字符匹配失败
systemverilog  // 中间匹配0个任意字符, 2个任意字符匹配失败
we212system4verilog // 中间匹配1个任意字符,  2个任意字符匹配失败
  • +:匹配前面那个字符1次以上

例子:

[ICer@IC_EDA /home/ICer/icer_pjs/my_basic_helloworld_1]grep -E "system.+verilog" grep.log  -i
systemhoveveuvievevhveriloghovhsviesystemweeverilog  // 匹配前面那个字符1次以上,匹配成功
systemmlvevbvvvfdoivhdov2334bcbdv4f+verilog23k_13#nsiuvg2232 // 匹配前面那个字符1次以上,匹配成功
systemsystemlvevbvvvfdoivhdov2334bcbdv4f+verilog23k_13#nsiuvg2232 // 匹配前面那个字符1次以上,匹配成功
system7verilog // 匹配前面那个字符1次,匹配成功
system7&verilog // 匹配前面那个字符2次,匹配成功
we212system4verilog // 匹配前面那个字符1次,匹配成功
systemverilog // 匹配前面那个字符0次,匹配失败
  • {M,N}:匹配前面那个字符至少M,最多N次

例子:

[my_basic_helloworld_1]grep -E "system.{5,20}verilog" grep.log  -i
systemhoveveuvievevhveriloghovhsviesystemweeverilog
systemi am a student verilog // 匹配前面字符15次,匹配成功!5次以下和20次以上,均匹配失败!
systemi am a boy verilog  // 匹配前面字符11次,匹配成功!5次以下和20次以上,均匹配失败!
  • {M,}:匹配前面那个字符至少M次,最多无限制

例子: 

略.....

  • {,N}:匹配前面那个字符最多N次(最少当然是0次)。注意,perl正则不支持这种方式

例子: 

略.....

  • {M}:匹配前面那个字符正好M次

例子: 

略.....

  • 锚定:锚定的意思是匹配位置,而非匹配字符实体
    • ^:匹配行首位置,注意匹配的是位置,不是字符
    • $:匹配行尾位置,注意匹配的是位置,不是字符

例子:

[my_basic_helloworld_1]grep -E  -e "^system" -e "verilog$" grep.log  -i
systemhoveveuvievevhveriloghovhsviesystemweeverilog
systemmlvevbvvvfdoivhdov2334bcbdv4f+verilog23k_13#nsiuvg2232
systemsystemlvevbvvvfdoivhdov2334bcbdv4f+verilog23k_13#nsiuvg2232
system7verilog
system7&verilog
systemverilog
systemi am a student verilog
systemi am a boy verilog
we212system4verilog

特殊且常用的的组合正则表达式:

  • ^$它表示匹配空行
  • .*匹配任意长度的任意字符,但不能匹配换行符

2. grep+中括号[]

中括号[] : 表示的是匹配任意一个,一般它和字符集的排序规则有关,不同工具采取的排序规则可能也不一样。

  • [abcd...]:匹配中括号内的任意一个字符

例子:

[my_basic_helloworld_1]grep -E "system[A-Z]verilog" grep.log  -i
system7verilog
we212system4verilog
[my_basic_helloworld_1]grep -E "system[D]verilog" grep.log  -i
systemDverilog
  • [^abcd...]:拒绝匹配中括号内的任意字符
  • [a-z]:匹配字母a到z
[my_basic_helloworld_1]grep -E "system[a-z]verilog" grep.log  -i
system7verilog
we212system4verilog
  • [A-Z]:匹配字母A到Z
[my_basic_helloworld_1]grep -E "system[A-Z]verilog" grep.log  -i
system7verilog
we212system4verilog
  • [0-9]:匹配0-9,也就是匹配数字

例子:

[my_basic_helloworld_1]grep -E "system[0-9]verilog" grep.log  -i
system7verilog
we212system4verilog
[my_basic_helloworld_1]grep -E "system[7]verilog" grep.log  -i
system7verilog

关于字母的排序:

  • perl中,A-Z排在a的前面,所以[A-z]表示所有大小写字母
  • grep中,A-Z排在z的后面,所以[a-Z]表示所有大小写字母
  • 还有些工具中,大小写的排序规则是aAbBcC...zZ,所以[a-C]表示aAbBcC共6个字母。

3. grep+ 字符类

特地专门命名的中括号序列;除了字符类,还有等价类、排序类,但基本用不上,只用字符类。

  • [:alpha:]:匹配字母,等价于[a-zA-Z]
  • [:digit:]:匹配数字,等价于[0-9]
  • [:xdigit:]:匹配十六进制数,等价于[0-9a-fA-F]
  • [:upper:]:匹配大写字母,等价于[A-Z]
  • [:lower:]:匹配小写字母,等价于[a-z]
  • [:alnum:]:匹配数字或字母,等价于[0-9a-zA-Z]
  • [:blank:]:匹配空白,包括空格和制表符
  • [:space:]:匹配空格,包括空格、制表符、换行符、回车符等各种类型的空白
  • [:punct:]:匹配标点符号。包括:! ' " ` # $ % & ( ) * + , . - _ / : ; < = > ? @ [ \ ] ^ { | } ~
  • [:graph:]:绘图类。包括:大小写字母、数字和标点符号。等价于[:alnum:]+[:punct:]
  • [:print:]:打印字符类。包括:大小写字母、数字、标点符号和空格。等价于[:alnum:]+[:punct:]+space
  • [:cntrl:]:控制字符类。在ASCII中,这些字符的八进制代码从000到037,还包括177(DEL)

需要注意的是,通常字符类在真正使用过程中,会再加上一个中括号,例如[[:alpha:]]。之所以如此,是因为这些字符类只是一种命名好的字符集合。例如[:lower:]对应的字符集合是a-z,而不是[a-z],所以要想让其表示这些命名字符类中的任一字符,需要再加上一层括号[[:lower:]],它才等价于[a-z]。可能会更有助于理解使用字符类的时候为什么要加两个中括号的例子是[^[:lower:]],它表示不包含任何小写字母。

例子:

[my_basic_helloworld_1]grep -E "system[[:alpha:]]verilog" grep.log  -i
systemDverilog

4. grep+ 反斜线序列

以下所说的单词,一般来说只包含数字、字母和下划线,即[_0-9a-zA-Z]。以下几种反斜线序列,基本上所有工具都支持:

  • \b:匹配单词边界处的空字符
  • \B:匹配非单词边界处的空字符
  • \<:匹配单词开头处的空字符
  • \>:匹配单词结尾处的空字符
  • \w:匹配单词构成部分,等价于[_[:alnum:]]
  • \W:匹配非单词构成部分,等价于[^_[:alnum:]]

以下几种,有些工具不支持,但perl都支持:

  • \s:匹配空白字符,等价于[[:space:]]
  • \S:匹配非空白字符,等价于[^[:space:]]
  • \d:匹配数字,等价于[0-9]
  • \D:匹配非数字,等价于[^0-9]

由于元字符.默认无法匹配换行符,所以需要匹配换行符的时候,可以使用特殊组合[\d\D]来替换换句话说,如果想匹配任意长度的任意字符,可以换成[\d\D]*,当然,前提是必须支持\d\D两个反斜线序列。

5. grep+ 分组捕获和反向引用

基础正则表达式中,使用括号可以对匹配内容进行分组并暂时保存,分组后会有分组编号,可以使用反斜线加编号\N的方式反向引用这些分组。

分组编号的方式是从左向右计算括号数,无论如何嵌套,第一个左括号对应的分组一定是编号1,用\1来引用,第二个左括号对应的分组一定是编号2,用\2来引用,依此类推。

例如grep的分组捕获:匹配两个连续相同的字母。

echo "abcddefg" | grep -E "(.)\1"

可以认为分组就是变量赋值的过程。例如,上面示例的匹配过程如下:
1.匹配第一个字母a,放进分组,即赋值给变量(假设变量名为$1),即$1="a",再继续执行正则表达式匹配过程的反向引用,它引用的是$1,于是表示第一个字母a后面还要是字母a,于是匹配失败。
2.匹配第二个字母b,放进分组,即$1="b",再匹配后一个字母,于是匹配失败。
3.字母c同样如此。
4.匹配字母d,放进分组,即$1="d",再匹配后一个字母,发现匹配成功,于是$1被保存下来。
5.已经匹配成功,于是结束。

对于只使用基础正则的工具来说,一般都只能引用\1\9共9个反向引用,最多自己额外提供一个所有表示匹配内容的反向引用(例如sed提供的&)。对于超出10个的分组,使用基础正则的工具一般来说是无能为力的。

再者,基础正则仅仅只是将分组匹配到的内容捕获,在正则操作结束后就丢失。但对于一门完整编程语言来说,这远远不够,几乎所有编程语言(如perl/java/python等)都会将正则的分组匹配内容保存为变量,使得可以在正则结束之后再次引用甚至修改它们。例如上面例子中分组捕获的字母d,如果换成perl,即使在这个匹配过程结束后,还是可以去引用这段分组。

6. grep+ 二选一

pattern1 | pattern2匹配竖线左边或者匹配竖线右边,都算匹配成功

二选一的结构几点需要说明:

  1. 因为竖线元字符的优先级很低,所以ab|cd匹配的是"ab"或"cd",而不是abd或acd。
  2. 成功匹配了左边,就不会再去对右边进行匹配
  3. 反向引用失败问题:竖线将两边的分组隔开,右边的永远无法反向引用左边的分组。

在二选一结构种,两个反向引用问题的典型例子:

例如a(.)|b\1将无法匹配"ba",因为评估了左边就不会评估右边。

例如([ac])e\1|b([xyz])\2t的左边能匹配aea或cec,但不能匹配cea或aec,右边能匹配bxxt或byyt或bzzt。但如果将\2换成\1,即([ac])e\1|b([xyz])\1t,将无法匹配b[xyz]at或b[xyz]ct,因为第一个分组括号在左边,无法参与右边的正则评估。

例子1:

[my_basic_helloworld_1]grep -E "system[a-z]verilog|system[0-9]verilog" grep.log  
system7verilog
we212system4verilog

 例子2:

[my_basic_helloworld_1]grep -E "system[a-z]verilog|system[0-9]verilog" grep.log  
systempverilog
system7verilog
we212system4verilog

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

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

相关文章

在idea中离线安装scala

由于网络受限&#xff0c;需要离线安装和使用scala&#xff0c;安装步骤如下。 1 安装idea scala插件 首先在idea的Help-Aboout选项中&#xff0c;查看idea的版本。 这里可以看到我的版本是2022.3&#xff0c;因此我需要下载对应版本的scala插件&#xff08;Scala插件地址&a…

git使用说明

在Windows上使用Git&#xff0c;可以从Git官网直接下载安装程序&#xff0c;然后按默认选项安装即可。 安装完成后&#xff0c;在开始菜单里找到“Git”->“Git Bash”&#xff0c;蹦出一个类似命令行窗口的东西&#xff0c;就说明Git安装成功&#xff01; 安装完成后&…

MySQL重大Bug!自增主键竟然不是连续递增

InnoDB 自增值保存在内存&#xff0c;MySQL 8.0后&#xff0c;才有了“自增值持久化”能力&#xff0c;即才实现了“若重启&#xff0c;表的自增值可以恢复为MySQL重启前的值”&#xff0c;具体情况是&#xff1a; ≤5.7&#xff0c;自增值保存在内存&#xff0c;无持久化。每…

基于免疫算法的认知无线电资源分配优化算法的matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 认知无线电&#xff08;CR&#xff09;的概念来自Joseph Mitolo博士1999年的开创性工作。它自适应地调整内部通信机制&#xff0c;通过学习&#xff0c;了解等实时变化特定的无线电操作参数&…

数据库实验四:触发器实验

实验四 触发器实验 1.实验目的 ​ 掌握数据库触发器的设计和使用方法。 2.实验内容和要求 ​ 定义BEFORE触发器和AFTER触发器&#xff0c;能够理解不同类型触发器的作用和执行原理&#xff0c;验证触发器的有效性。 3.实验重点和难点 ​ 实验重点&#xff1a;触发器的定义…

大二Web课程设计——张家界旅游网站设计与实现(HTML+CSS+JavaScript)

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…

【应用】Modbus 通讯协议

Modbus 通讯协议Modbus 协议基础Modbus 存储区Modbus-RTU 协议Modbus-TCP 协议Java 实现 Modbus 通讯Modbus ReadModbus Write模拟数据进行代码测试Modbus-RTU 代码验证Modbus-TCP 代码验证SerialPortWrapper 实现类代码Modbus 协议基础 Modbus 是一种总线通讯协议&#xff0c;…

[附源码]计算机毕业设计贵港高铁站志愿者服务平台Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis MavenVue等等组成&#xff0c;B/S模式…

Spring Bean的生命周期

一、首先我们要知道什么是Spring Bean&#xff1a;Spring Bean是Spring框架在运行管理时的对象。 二、Spring Bean的生命周期&#xff1a; 简单来说bean会经历四个阶段&#xff1a; 实例化 -》 属性赋值 -》初始化 -》销毁 下面我们来具体看一下&#xff1a; 1.实例化 Bea…

软件质量评估模型

软件质量是指软件产品满足用户要求的程度。可以从多个方面来理解此处所指的用户要求,包括用户期望的软件系统的功能、性能、可维护性、可操作性、可重用性等等。在软件项目实施过程中,经常会听到用户关于软件系统的以下一组质量评价。 软件系统没有某些方面的功能软件系统运行…

【5G MAC】NR Timing Advance(RAR TA 和 MAC-CE TA)

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

[Linux]基础命令(1)

Linux基本命令&#xff08;1&#xff09; 文章目录Linux基本命令&#xff08;1&#xff09;1.操作系统&#xff1a;&#xff08;1&#xff09;什么是操作系统&#xff1a;&#xff08;2&#xff09;为什么要有操作系统&#xff1a;2. ls命令:3. pwd指令&#xff1a;4. cd命令:5…

2022-12-11

文章目录前言PWMPwmChannelPwmAssignedHwUnitPwmChannelIdPwmCoherentUpdatePwmDutycycleDefaultPwmIdleStatePwmNotificationPwmChannelClassPwmPeriodDefaultPwmPolarityPwmReferenceChannelPwmSafetySignalPwmShiftValuePWM输出偏移的使用PwmConfigurationOfOptApiServicesP…

windows 基于 MediaPipe 实现 Holistic

主页: https://google.github.io/mediapipe/solutions/holistic.html MediaPipe Holistic pipelines 集成了姿势、面部和手部组件的独立模型&#xff0c;每个组件都针对其特定领域进行了优化&#xff0c;每个组件的推断输入图不同。 MediaPipe Holistic 首先通过 BlazePose 的姿…

基于极限学习机进行股市预测(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

MySQL-InnoDB的事务隔离级别

MySQL 是一个服务器&#xff0f;客户端架构的软件&#xff0c;对于同一个服务器来说&#xff0c;可以有若干个客户端与之连接&#xff0c;每个客户端与服务器连接上之后&#xff0c;就可以称之为一个会话&#xff08; Session &#xff09;。我们可以同时在不同的会话里输入各种…

【图像处理】opencv | 图像的载入,显示,保存 | 视频流的载入,显示,保存

文章目录前言一、cv2读取图片并展示1.1、cv2.imread读取图片1.2、cv2.imshow展示图片1.3、完整代码1.4、封装函数调用1.5、cv2读取为灰度图像1.6、cv2.imwrite保存图像二、cv2读取视频并且展示2.1 展示彩色视频2.2 展示灰度视频2.3 保存视频前言 本文参考视频&#xff1a;唐宇…

二进制搭建k8s——部署etcd集群和单master

二进制搭建k8s——部署etcd集群和单master二进制搭建k8s——部署etcd集群和单master环境1、操作系统初始化配置&#xff08;全部节点&#xff09;2、部署 docker 引擎&#xff08;所有节点&#xff09;3、部署 etcd 集群准备签发证书环境在 master01 节点上操作在 node01 和 no…

端口隔离实现同一vlan下,二层和三层的互不通

如图&#xff1a;我们要实现下图中&#xff0c;PC1和PC2不通&#xff0c;但都和PC3互通&#xff1a; 配置如下&#xff1a; vlan batch 10 port-isolate mode all # interface GigabitEthernet0/0/1 port link-type access port default vlan 10 port-isolate enable grou…

【golang】 demo 之王realworld,使用golang+gin做后端技术,使用vue做前端项目的开源博客项目

目录前言1&#xff0c;关于realworld项目2&#xff0c;前端项目使用vue3开发的3&#xff0c;后端使用golanggin进行接口开发4&#xff0c;总结前言 本文的原文连接是: https://blog.csdn.net/freewebsys/article/details/108971807 未经博主允许不得转载。 博主CSDN地址是&…