Linux 运维 | 6.从零开始,Shell编程中正则表达式 RegExp 速成指南

news2024/9/27 11:21:19

f5f54acf0f90b358b06b2ab122b576d6.gif

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ]

0x00 前言概述

在 Linux 运维以及Shell脚本编程中往往会使用到各种文本处理工具(例如,文本三剑客 awk、grep、sed)以及Shell脚本编程(后续作者会在#运维从业必学专栏中发布),在使用时往往都有正则表达式的身影,使用正则表达式可以非常方便的从大量的文本数据中匹配过滤出特定的数据(例如,只从 ip addr 命令中提取 ip 地址),除此之外在Windows系统防火墙/WAF规则以及各种编程语言中也是支持,只不过有些许扩展正则表达式可能有所不同,但都大同小异,综上所述,无论是运维、开发、安全都要好好的学习正则表达式。

8471911e5fa4c6e18863e47eb862f424.png

本文是作者花费一定的时间,从学习、运维开发工作中总结而来,算是在Linux中Shell编程学习文章中讲解表达式比较全和精炼的,让各位初学者可以快速了解什么是正则表达式、正则表达式的分类,以及简单使用正则表达式在Linux中进行特定字符串数据的提取过滤,使之看友们可以自行根据需要编写出更加复杂的正则表达式,这也是作者的初衷,如果感觉此文对你有帮助的话,就请多多支持作者【#运维从业必学】专栏。

正则表达式介绍

定义描述:正则表达式(RE's,regular expression)是你所定义的模式模板(pattern template),采用不同算法通常使用PCRE(Perl Compatible Regular Expressions)软件模块来处理正则表达式,Linux 命令行工具可以用它来过滤文本,例如 grep、sed 编辑器或 gawk 程序能够在处理数据时使用正则表达式对数据进行模式匹配,如果数据匹配模式,它就会被接受并进一步处理;如果数据不匹配模式,它就会被滤掉。

区别问题:正则表达式与我们常常使用的星号通配符(*)有何区别呢? 描述:正则表达式模式利用通配符来描述数据流中的一个或多个字符(不确定的数据),而星号通配符允许你只列出满足特定条件的文件,即要么前缀、要么后缀,要么前后缀,例如 ls -alh *user*,匹配带有user字符串的文件名称。

# 通配符,带有 user 字符串的都将显示。
$ ls *user*
  testuser  user.patch  user.txt userrr.txt userr.txt

# 正则,带有 user 字符串且紧随其后的多个r字符都将被匹配。
$ ls | grep "user*"
  testuser
  user.patch
  userrr.txt
  userr.txt
  user.txt

3779b255915090b1ed39a8e45627f930.png

weiyigeek.top-正则表达式与通配符的区别图

总结:虽然上述生成的效果一样,但是正则匹配出的高亮显示的却有不同,实际上使用场景也是不同的,通配符主要是找寻匹配文件名,例如,find,ls,cp,mv等命令中使用,而正则则处理文本内容中的字符,例如gerp、awk、sed、vim、expr等命令中使用。


正则表达式分类

在 Linux 系统 Shell 编程中的正则表达式,便是使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,这里可以将POSIX正则表达式分为基本正则表达式(BRE,Basic Regular Expressions)和扩展表达式(ERE,Extended Regular Expressions)以及Perl正则表达式(PRE,Perl Regular Expressions), 但是不同的 Linux 文本处理命令支持的正则比表达式有所不同,我们可执行man 7 regex命令查看帮助。

命令支持情况:

类型grepgrep -Egrep -Psedsed -rvimoreegrepawk
BRE




ERE




PRE







正则表达式元字符(Shell):

字符含义支持的类型
\将下一个字符标记为特殊字符,或者将一个元字符转义为普通字符,例如,\{ 表示一个{字符。BOTH
^匹配输入字符串的开始位置BOTH
$匹配输入字符串的结束位置BOTH
.匹配除\n之外的任何单个字符BOTH
*匹配前面的子表达式0次或者多次,例如, zo*能匹配z和zooBOTH
?匹配前面的子表达式0次或者1次ERE
+匹配前面的子表达式1次或者多次,例如, zo+能匹配zo和zoo,但不能匹配zERE
|匹配于|符号前或后的正则表达式ERE
{n,m}最少匹配n次,最多匹配m次和BRE的区别是不需要加\ERE
()元组可以包含在其中表达式匹配的字符串进行调用和BRE的区别是不需要加\ERE
<匹配词(word)的开始BRE
>匹配词(word)的结束BRE
\b匹配单词开头和结尾位置BRE
\B匹配非单词开头和结尾位置BRE
\d匹配一个数字字符RRE
\D匹配一个非数字字符PRE
\w匹配包括下划线的任何单词字符,"单词"字符使用Unicode字符集,等价于[[:alnum:]]PRE
\W匹配任何非单词字符,等价于[^[:alnum:]] PRE
\f匹配一个换页符 : 00001100 14 12 0C FF (NP form feed, new page)PRE
\n匹配一个换行符 :00001010  12  10  0A   LF (NL line feed, new line)PRE
\r匹配一个回车符 :00001101  15  13  0D   CR (carriage return)PRE
\s匹配任何不可见字符,包括空格、制表符、换页符,等价于[ \f\n\r\t\v]。PRE
\S匹配任何可见字符,等价于[^ \f\n\r\t\v]PRE
\t匹配一个水平制表符 : 00001001  11  9  9  HT (horizontal tab)PRE
\v匹配一个垂直制表符 : 00001011  13  11  0B   VT (vertical tab)PRE
\cx匹配由x指明的控制字符BRE
{n}匹配前面的子表达式n次BRE
{n,}至少匹配前面的子表达式n次BRE
{,m}最多匹配前面的子表达式m次BRE
{n,m}最少匹配n次,最多匹配m次BRE
()元组,将(与)间的模式存储在特殊的保留空间BRE
()\数字重复在(与)方括号内第n个子模式至此点的模式,例如 ls | grep "\(user\)\1" 将()元字符匹配到的数据进行调用BRE
[xyz]匹配xyz中的任何一个字符BOTH
[^xyz]匹配未包含的任意字符BOTH
[x-z]匹配小写的字符BOTH

除了定义自己的字符组外,BRE 还包含了一些特殊的字符组,可用来匹配特定类型的字符,注意:此特殊元字符有的命名是不支持的,经测试vi , grep , awk , sed , expr等命令是支持殊字符组。

[[:alpha:]] 匹配任意字母字符,不管是大写还是小写
[[:alnum:]] 匹配任意字母数字字符 0~9、A~Z 或 a~z
[[:blank:]] 匹配空格或制表符 " " 和 TAB 字符
[[:digit:]] 匹配 0~9 之间的数字
[[:lower:]] 匹配小写字母字符 a~z
[[:upper:]] 匹配任意大写字母字符 A~Z
[[:print:]] 匹配任意可打印字符
[[:punct:]] 匹配标点符号
[[:space:]] 匹配任意空白字符:空格、制表符、NL、FF、VT 和 CR

特别注意,Linux 系统语系的配置会影响正则表达式的匹配结果,例如:LANG=CLANG=zh_CN,由于不同语系的编码数据不同,所以造成不同语系的数据选取结果有所差异。因此在使用正则表达式时要特别留意语系,由于我们一般使用的兼容与 POSIX 的标准,建议使用 C 语系;

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

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

相关文章

【C语言从不挂科到高绩点】23-指针05-结构体指针【重点知识】

Hello!彦祖们,俺又回来了!!!,继续给大家分享 《C语言从不挂科到高绩点》课程!! 本节将为大家讲解C语言中非常重要的知识点-指针: 本套课程将会从0基础讲解C语言核心技术,适合人群: 大学中开设了C语言课程的同学想要专升本或者考研的同学想要考计算机等级证书的同学想…

CSS在线格式化、美化、压缩工具

网上有不少CSS格式化压缩的工具&#xff0c;但是不少站点有广告干扰&#xff0c;或操作起来不方便&#xff0c;或打开速度比较慢&#xff0c;所以自己定制了这个css格式化压缩的工具&#xff0c;也希望对大家有帮助&#xff0c;提供的这个CSS代码格式化和css在线压缩工具&#…

银发产业新闻 | 饿了么、一龄集团、达因药业、爱奇艺有哪些布局

一周银发产业大事件速览 9月27日 星期五 1 养老服务 国家医保局发布长护险编码规则民政部召开全国养老服务工作推进会议市场监管总局发布《适老家具通用技术要求》中央财政安排3亿元引导资金支持“老年食堂”发展全国老龄委印发《关于深入开展新时代“银龄行动”的指导意见…

行业标准如何立项?具体的步骤有哪些

一、前期准备 1. 明确需求&#xff1a; • 确定所在行业存在哪些问题或不足&#xff0c;需要通过制定行业标准来规范和解决。 • 分析行业发展趋势和市场需求&#xff0c;确保立项的标准具有前瞻性和实用性。 收集资料&#xff1a; 查阅国内外相关行业标准和法律法规&#xff0…

数字单总线输出的工业级温湿度一体传感器-MHT04

温湿度传感芯片 - MHT04&#xff0c;该芯片是数字单总线输出的工业级温湿度一体传感器&#xff0c;采用防尘防水透气的铂金叠层湿敏探头结合高精度电容调理芯片MDC04架构&#xff0c;数字单总线输出&#xff0c;可长距离串联多个节点&#xff0c;适用于仓储、冷链、畜牧、工农业…

SQL 性能调优

什么是 SQL 性能调优 SQL 性能调优是优化 SQL 查询以尽可能高效地运行的过程&#xff0c;从而减少数据库负载并提高整体系统性能。这是通过各种技术实现的&#xff0c;例如分析查询执行计划、优化索引和重写查询以确保最佳执行路径。目标是最大限度地减少执行查询所需的时间和…

写一个算法统计在输入字符串中各个不同字符出现的频度并将结果存入文件(字符串中的合法字符为A-Z这26个字母和0-9这十个数字)

题目分析&#xff0c;一共需要最多需要36个位置的数组&#xff0c;我们把前十个数组位置给0-9个数字字符存放空间&#xff0c;10-36的数组空间给到A-Z的存放 int main() {printf("请输入一串字符串内容,并且以#结束输入\n");char arr[36], ch;//26个大写字符10个数字…

力扣 中等 24.两两交换链表中的节点

文章目录 题目介绍题解 题目介绍 题解 利用25题K个一组反转链表链接 &#xff0c;将k改为2即可。 // 同 25题 K个一组反转链表 class Solution {public ListNode swapPairs(ListNode head) {// 统计节点个数int n 0;for (ListNode cur head; cur ! null; cur cur.next) {n…

【工具分享】Magniber勒索病毒解密工具

前言 Magniber勒索软件首次出现在2017年&#xff0c;最初主要针对韩国的用户。它是通过使用Magniber Exploit Kit (EK)传播的&#xff0c;这款勒索软件迅速成为网络威胁的一部分。尽管最初集中于亚洲地区&#xff0c;Magniber在2021年卷土重来&#xff0c;并开始扩展到全球范围…

扩展 SaaS 业务:2024 年取得成功的基本策略

在不断发展的数字世界中&#xff0c;软件即服务&#xff08;SaaS&#xff09;已成为关键要素&#xff0c;在不同领域提供了无与伦比的实用性和易用性。然而&#xff0c;在这个蓬勃发展的领域取得成功不仅仅需要创新的产品。仅仅具有可行性是不够的。要真正蓬勃发展&#xff0c;…

Redis桌面工具:Tiny RDM

1.Tiny RDM介绍 Tiny RDM&#xff08;Tiny Redis Desktop Manager&#xff09;是一个现代化、轻量级的Redis桌面客户端&#xff0c;支持Linux、Mac和Windows操作系统。它专为开发和运维人员设计&#xff0c;使得与Redis服务器的交互操作更加便捷愉快。Tiny RDM提供了丰富的Red…

基于Hive和Hadoop的保险分析系统

本项目是一个基于大数据技术的保险分析系统&#xff0c;旨在为用户提供全面的汽车保险信息和深入的保险价格分析。系统采用 Hadoop 平台进行大规模数据存储和处理&#xff0c;利用 MapReduce 进行数据分析和处理&#xff0c;通过 Sqoop 实现数据的导入导出&#xff0c;以 Spark…

在 OpenEuler 中配置 KVM 虚拟化环境指南

本指南旨在为读者提供一个详细的步骤说明&#xff0c;帮助大家在 OpenEuler 系统中配置 KVM 虚拟化环境。无论您是初学者还是有一定经验的用户&#xff0c;这份指南都将涵盖从环境准备、安装到虚拟机管理的各个方面&#xff0c;确保您能够顺利地搭建并管理自己的虚拟化平台。 …

FOC电机驱动开发踩坑记录

关键技术 SVPWM电机磁场控制电流采样park变换和Clark变换滑膜观测器&#xff08;无感FOC&#xff09; SVPWM电机磁场控制 SVPWM主要思想是通过精确的对UVW三相电流的分时控制&#xff0c;来控制转子的合成力矩&#xff0c;达到目标方向&#xff0c;常用的是6分区的设计&…

新160个crackme - 066-Andrnalin.3

运行分析 文字是德语&#xff0c;需要破解Key PE分析 VB程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 使用 VB Decompiler 静态分析&#xff0c;发现逻辑如下&#xff1a;1、提取Key每个字符 102、计算后的Key要与"kXy^rO|yXom\kMuOn*"相等 算法分析…

基于单片机的小车行走加温湿度检测系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;采样DHT11温湿度传感器检测温湿度&#xff0c;滑动变阻器连接数码转换器模拟电量采集传感器&#xff0c; 电机采样L298N驱动&#xff0c;各项参数通过LCD1602显示&#x…

影刀--- 自动化机器人需要了解的三大逻辑

这篇文章主要就是在影刀这个软件中对于循环和条件命令的使用&#xff0c;进行各种逆天操作 希望大家多多支持啊 目录 1.条件判断的基本用法&#xff08;单分支&#xff09;2.二分支3.多分支4.条件的嵌套与多条件判断](https://flowus.cn/ceb9d0ea-1963-418d-b782-d2d77bfb6e53…

Java 环境变量的设置及其目的

文章目录 1. **为什么要设置Java环境变量&#xff1f;**2. **设置Java环境变量的步骤&#xff08;Windows举例&#xff09;**3. **设置环境变量的目的**3.1 原理1. **PATH 环境变量的作用**2. **JDK 的 bin 目录**3. **执行流程**4. **示例&#xff08;Linux&#xff09;** 总结…

【React】react hooks的使用规则

1. 使用规则 1.1 反例 import { useState } from react// 错误1 // useToggle()function Son() {return <div>子组件</div> }function useToggle() {const [isShow, setIsShow] useState(true)function toggle() {setIsShow(!isShow)}return {isShow,toggle} }fu…

传输大咖49 | 镭速助力影视传媒行业跨国文件传输更加安全、高效

在影视传媒领域&#xff0c;跨国合作已成为常态&#xff0c;伴随而来的是跨国文件交换的日益频繁。这无疑对文件的跨国传输效率、安全性和稳定性提出了更为严格的标准。接下来&#xff0c;我将为您分析影视传媒业在进行跨国文件传输时所面临的挑战&#xff0c;并提供一些有效的…