当前位置: 首页 > news >正文

【网络运维】Linux:正则表达式

Linux 正则表达式

正则表达式是一种强大的文本匹配工具,它使用特定的模式来搜索、匹配和操作字符串。在Linux环境中,正则表达式被广泛应用于各种工具(如grep、sed、awk等)和编程语言中。

本文将全面介绍Linux正则表达式的基本概念和用法。


正则表达式基础

正则表达式由普通字符元字符组成:

  • 普通字符:包括所有字母、数字、标点符号等可打印字符
  • 元字符:具有特殊含义的字符,如 .*^

正则表达式可分为两类:

  • 普通正则表达式(Basic Regular Expressions)
  • 扩展正则表达式(Extended Regular Expressions),支持更多元字符

环境准备

首先创建一个测试文件:

[furongwang@shell ~]$ vim words
cat
category
acat
concatenate
dog

普通字符匹配

最简单的正则表达式就是普通字符本身:

[furongwang@shell ~]$ cat words | grep 'cat'
cat
category
acat
concatenate

字符集匹配

[...] - 匹配任意一个字符

[furongwang@shell ~]$ echo cbt >> words 
[furongwang@shell ~]$ echo c1t >> words
[furongwang@shell ~]$ cat words | grep 'c[ab]t'
cat
cbt

范围匹配

  • [a-z]:匹配所有小写字母
  • [A-Z]:匹配所有大写字母
  • [0-9]:匹配所有数字
[furongwang@shell ~]$ cat words | grep 'c[a-z]t'
cat
cbt[furongwang@shell ~]$ echo cCt >> words 
[furongwang@shell ~]$ cat words | grep 'c[A-Z]t'
cCt[furongwang@shell ~]$ cat words | grep 'c[0-9]t'
c1t

[^...] - 排除字符

[furongwang@shell ~]$ cat words | grep 'c[^ab]t'
c1t# ^放中间会被当做普通字符
[furongwang@shell ~]$ echo c^t >> words
[furongwang@shell ~]$ cat words | grep 'c[a^b]t'
cat
category
acat
concatenate
cbt
c^t

. - 匹配任意单个字符

[furongwang@shell ~]$ cat words | grep 'c.t'
cat
category
acat
concatenate
cbt
c1t
cCt
c.t
c^t

\ - 转义字符

[furongwang@shell ~]$ echo c.t >> words 
[furongwang@shell ~]$ cat words | grep 'c\.t'
c.t

| - 或操作(扩展正则表达式)

[furongwang@shell ~]$ cat words | egrep 'cat|dog'
# 或者
[furongwang@shell ~]$ cat words | grep -E 'cat|dog'
cat
category
acat
concatenate
dog

字符类

字符类描述等价形式
[[:digit:]]数字[0-9]
[[:xdigit:]]十六进制数字[0-9a-fA-F]
[[:lower:]]小写字母[a-z]
[[:upper:]]大写字母[A-Z]
[[:alpha:]]字母字符[A-Za-z]
[[:alnum:]]字母数字字符[0-9A-Za-z]
[[:blank:]]空白字符(空格、制表符等)
[[:space:]]空白字符
[[:punct:]]标点符号
[[:print:]]可打印字符
[[:graph:]]可打印字符(不包括空格)
[[:cntrl:]]控制字符

非打印字符

字符描述
\c匹配控制字符
\f匹配换页符
\n匹配换行符
\r匹配回车符
\s匹配任何空白字符
\S匹配任何非空白字符
\w匹配字母、数字、下划线
\W匹配任何非单词字符
\t匹配制表符
\v匹配垂直制表符

grep命令支持\w\W\s\S


定位符

^ - 匹配行首

[furongwang@shell ~]$ cat words | grep '^cat'
cat
category

$ - 匹配行末

[furongwang@shell ~]$ cat words | grep 'cat$'
cat
acat

\b - 单词边界

[furongwang@shell ~]$ echo hello cat >> words 
[furongwang@shell ~]$ cat words | grep '\bcat'
cat
category
hello cat

\B - 非单词边界

[furongwang@shell ~]$ cat words | grep '\Bcat'
acat
concatenate

\<\> - 单词边界

# \< 匹配单词左边界
[furongwang@shell ~]$ cat words | grep '\<cat'
cat
category
hello cat# \> 匹配单词右边界
[furongwang@shell ~]$ cat words | grep 'cat\>'
cat
acat
hello cat

次数限定

* - 匹配0次或多次

[furongwang@shell ~]$ echo dg >> words 
[furongwang@shell ~]$ echo doog >> words 
[furongwang@shell ~]$ cat words | grep 'do*g'
dog
dg
doog

+ - 匹配1次或多次(扩展正则表达式)

[furongwang@shell ~]$ cat words | egrep 'do+g'
dog
doog

? - 匹配0次或1次(扩展正则表达式)

[furongwang@shell ~]$ cat words | egrep 'do?g'
dog
dg

{n} - 匹配n次(扩展正则表达式)

[furongwang@shell ~]$ cat words | egrep 'do{2}g'
doog

{m,n} - 匹配m到n次(扩展正则表达式)

[furongwang@shell ~]$ echo dooog >> words
[furongwang@shell ~]$ echo doooog >> words [furongwang@shell ~]$ cat words | egrep 'do{2,3}g'
doog
dooog

{m,} - 匹配至少m次(扩展正则表达式)

[furongwang@shell ~]$ cat words | egrep 'do{2,}g'
doog
dooog
doooog

{,n} - 匹配最多n次(扩展正则表达式)

[furongwang@shell ~]$ cat words | egrep 'do{,3}g'
dog
doog
dg
dooog

() - 子表达式(扩展正则表达式)

[furongwang@shell ~]$ echo dogdog >> words 
[furongwang@shell ~]$ echo dogdogdog >> words 
[furongwang@shell ~]$ echo dogdogdogdog >> words # 匹配包含重复了2-3次()中内容的行
[furongwang@shell ~]$ cat words | egrep '(dog){2,3}'
dogdog
dogdogdog
dogdogdogdog

反向引用

对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。

每个缓冲区都可以使用 \N 访问,其中 N 为一个标识特定缓冲区的一位或两位十进制数。

\N 这用引用方式称之为反向引用。

反向引用允许你引用前面捕获的子表达式:

[furongwang@shell ~]$ echo 'furongwang litangwang otto furongwang litangwang otto' | \
> egrep -o '(furongwang) (litangwang).*\1'# 输出结果
furongwang litangwang otto furongwang[furongwang@shell ~]$ echo 'Is is the cost of of gasoline going up up?' | \
> egrep -o '\b([a-z]+) \1\b' 
# 正则表达式解释:
#   \b        : 单词边界,确保匹配的是完整单词
#   ([a-z]+)  : 捕获组1,匹配一个或多个小写字母(一个单词)
#   \s+       : 匹配一个或多个空白字符(空格、制表符等)
#   \1        : 反向引用,匹配与第一个捕获组完全相同的内容(即至少重复出现了一次的内容)
#   \b        : 单词边界,确保匹配的是完整单词
# 输出结果
of of
up up

实战练习:过滤有效IPv4地址

给定以下文件内容:

0.0.0.0
1.1.1.1
11.11.11.111
111.111.111.111
999.9.9.9
01.1.1.1
10.0.0.0
0.1.1.1
266.1.1.1
248.1.1.1
256.1.1.1

过滤出所有有效IPv4地址的正则表达式:

\b(([1-9][0-9]?)|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))(\.(([0-9])|([1-9][0-9])|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))){3}\b

或者更简洁的版本:

'\b([1-9][0-9]?|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){2}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\b'
http://www.lryc.cn/news/627038.html

相关文章:

  • 虚幻引擎目录结构
  • AGV小车cad+三维图+设计说明书
  • C++ 力扣 438.找到字符串中所有字母异位词 题解 优选算法 滑动窗口 每日一题
  • Java 线程池ThreadPoolExecutor源码解读
  • 服务器内存条不识别及服务器内存位置图
  • linux的sysctl系统以及systemd系统。
  • 【网络运维】Linux 文本处理利器:sed 命令
  • MYSQL-增删查改CRUD
  • uni-app跨端开发最后一公里:详解应用上架各大应用商店全流程
  • 生产级的雪花算法
  • 自动驾驶导航信号使用方式调研
  • C语言实现全排列(非递归法)(以猪八戒买包子的故事为例解释)
  • SpringBoot 整合 Langchain4j RAG 技术深度使用解析
  • imx6ull-驱动开发篇30——Linux 非阻塞IO实验
  • redis---常用数据类型及内部编码
  • 设计具有功能安全和网络安全能力的新型半导体芯片
  • 攻克PostgreSQL专家认证
  • Unicode 字符串转 UTF-8 编码算法剖析
  • JVM面试精选 20 题(终)
  • SQL count(*)与 sum 区别
  • 第三阶段数据-4:SqlHelper类,数据库删除,DataTable创建
  • STM32F4 内存管理介绍及应用
  • 建模工具Sparx EA的多视图协作教程
  • PyTorch - Developer Notes
  • 吴恩达 Machine Learning(Class 3)
  • 国产化PDF处理控件Spire.PDF教程:如何使用 Python 添加水印到 PDF
  • Linux命令大全-ps命令
  • Linux系统之部署nullboard任务管理工具
  • 基于springboot中学信息技术课程教学网站
  • 栈上创建和堆上创建区别