Shell 编程 —— 正则表达式与文本处理器

发布于:2025-09-05 ⋅ 阅读:(21) ⋅ 点赞:(0)

前言

        在Linux系统管理与Shell脚本编程中,高效、精准地处理文本是一项核心能力。无论是分析冗长的系统日志、解析复杂的配置文件,还是进行批量文本操作,都离不开强大的文本处理工具。正则表达式(Regular Expression)作为描述字符串模式的通用语言,正是这一切的基石。它搭配grepsedawk等文本处理器,可以让我们用简洁的规则完成复杂的查找、过滤、替换和提取任务,从而极大地提升工作效率和脚本的智能化水平。

        本章将系统性地介绍正则表达式的基本概念、语法规则及其在Linux环境下的分类(BRE与ERE),并通过大量实例详细讲解最常用的文本搜索工具grep的用法。无论您是初学者还是希望巩固基础,本章内容都将为您打下坚实的文本处理基础,助您解锁Shell编程的更高级技能。

1. 正则表达式

1.1 定义

  • 正则表达式(Regular Expression, regex/regexp/RE)是一种用来描述字符串模式的规则。

  • 功能:检索、替换、过滤符合特定规则的字符串。

1.2 用途

  • 系统日志筛选(如定位“登录失败”“服务启动失败”)

  • 配置文件解析

  • 文本查找替换

  • 脚本编程中的条件匹配

1.3 Linux 正则表达式分类

  1. BRE (基础正则表达式)

    • 传统语法,功能有限

    • 量词 {} 需要转义 \{n,m\}

    • +, ?, () 需要转义

    • 常用工具:grepsed

  2. ERE (扩展正则表达式)

    • 功能更强大,语法简洁

    • +, ?, (), {}, | 等无需转义

    • 常用工具:egrep (grep -E)、awk

1.4 正则表达式组成

1.4.1 普通字符
  • 字母、数字、标点符号等本身。

1.4.2 BRE 中的元字符 (Metacharacters)
字符 功能描述
. **匹配任何单个字符,换行符除外( 换行符(\n)、回车符(\r)) 例如 a.c 匹配 abc, aac, a-c
* 量词:匹配前一个字符(或表达式)零次或多次。 例如 a* 匹配 ""(空), a, aa, aaa...
^

1. 锚点:匹配行的开头。                                        例如 ^Hello 匹配以 "Hello" 开头的行。

2. 在[ ]内:表示取反(字符组中第一个字符时)     例如 [^0-9] 匹配任何非数字字符。

$ 锚点:匹配行的结尾。例如 world$ 匹配以 "world" 结尾的行。
[ ] 开始一个字符组。例如 [aeiou] 匹配任何一个元音字母。
\

1. 转义符:取消后续字符的特殊含义,使其成为普通字符             例如 \. 匹配一个真实的点号。

2. 激活符赋予后续字符特殊含义(这是BRE独有的特点)         例如 \{ 激活花括号的量词功能。

1.4.3 重复次数
  • * 0 次或无数次

    匹配前面子表达式0次或者多次 例:goo*d、go.*d
  • \+ 至少 1 次

    匹配其前面的字符出现最少1次,即:肯定有且 >=1 次
  • \{n\} 恰好 n 次

    匹配前面的子表达式n次,例:go\{2\}d、'[O-9]\{2\}'匹配两位数字
  • \{m,n\} m 到 n 次

    匹配前面的子表达式n到m次,例: go\{2,3\}d、'[0-9]\{2,3\}'匹配两位到三位数字
  • \{n,\} 至少 n 次

    匹配前面的子表达式不少于n次,例: go\{2,\}d、' [0-9]\{2,\}'匹配两位及两位以上数字

2. grep —— 条件查找

常用选项

  • -E:启用扩展正则

  • -c:统计匹配行数

  • -i:忽略大小写

  • -o:只输出匹配内容

  • -v:反向匹配(不包含的行)

  • -n:显示行号

  • --color=auto:高亮匹配

示例

grep -c root /etc/passwd       # 统计 root 出现的行数
grep -i 'the' web.sh           # 不区分大小写匹配
grep -v root /etc/passwd       # 输出不包含 root 的行
grep -o ifconfig | '[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+' # 提取 IP 地址

3. 基础正则 vs 扩展正则

BRE 常见元字符

  • ^ 行首

  • $ 行尾

  • . 任意单字符

  • [list] 匹配字符集

  • [^list] 反向匹配

  • * 0 或多次

  • \{n\} 精确次数

  • \{n,\} 至少 n 次

  • \{n,m\} n~m 次

ERE 新增功能

  • + 一个或多个

  • ? 0 或 1 次

  • | 或者(OR)

  • () 分组

  • ()+ 匹配重复的组


4. 元字符操作案例

  1. 查找特定字符

grep -n 'the' test.txt       # 查找 the
grep -vn 'the' test.txt      # 反向匹配
  1. 中括号集合

grep -n 'sh[io]rt' test.txt  # shirt 或 short
grep -n '[^w]oo' test.txt    # 前面不是 w 的 oo
grep -n '[wd]' test.txt      # 查找 有(w或d)--简单来说(找 有 w 或 d 的行)
grep -n '[^wd]' test.txt     # 查找 有(非w且非d)--简单来说(找 有[非w且非d]的行)
grep -nv '[wd]' test.txt     # 查找 没有(w或d)——简单来说(找 没有w和d的行)
grep -nv '[^wd]' test.txt    # 查找 没有(非w且非d)——简单来说(找 没有[非w且非d]的行)
  • 定位符***

grep -n '^the' test.txt      # 行首是 the
grep -n '\.$' test.txt       # 行尾是 .
grep -n '^$' test.txt        # 空行
  • 点与星

grep -n 'w..d' test.txt    # w 开头 d 结尾,中间任意两个字符
grep -n 'woo*d' test.txt   # wo 开头 d 结尾,中间 o (数量为0到无数个)
grep -n 'w.*d' test.txt    # w 开头 d 结尾,中间任意字符[.*意思是有0~无数个“.”(而“.”表示任意字符)]
执行以下命令即可查询任意数字所在行。
grep -n '[0-9][0-9]*' test.txt    #至少有1个数字
grep -n '[0-9]*' test.txt        #至少有0个数字
  • 次数限定符

#查询两个 o 的字符。
grep -n 'o\{2\}' test.txt        # oo
​
#查询以 w 开头以 d 结尾,中间包含 2~5 个 o 的字符串
grep -n 'wo\{2,5\}d' test.txt    # w 开头 d 结尾,2-5 个 o
​
#查询以 w 开头以 d 结尾,中间包含 2 个或 2 个以上 o 的字符串。
grep -n 'wo\{2,\}d' test.txt     # 至少两个 o

5.总结

        本章系统地讲解了正则表达式的基础知识及其在Linux文本处理,特别是在grep工具中的应用。核心内容可归纳为以下几点:

  1. 核心概念:正则表达式是一种用于描述字符串模式的规则,是文本检索、替换和过滤的强大工具,广泛应用于日志分析、配置解析和脚本编程中。

  2. 两大分类:Linux中的正则表达式主要分为基础正则表达式(BRE)扩展正则表达式(ERE)。前者语法传统,元字符如{ }( )+?需要转义;后者功能更强大,这些元字符无需转义,语法更简洁。

  3. 元字符体系:掌握了构成正则表达式的核心元字符及其功能,包括:

    • 定位符^(行首)、$(行尾)

    • 匹配符.(任意单个字符)、[](字符集合)、[^](反向字符集)

    • 量词*(0次或多次)、\+(至少1次,BRE需转义)、\{n,m\}(指定次数范围,BRE需转义)

  4. 实践工具:重点掌握了文本搜索利器grep的常用选项(如-i忽略大小写、-v反向匹配、-n显示行号、-o只输出匹配内容)及其与正则表达式结合使用的多种实战案例,从而能够高效地完成各种文本搜索任务。

  5. 学习路径:正则表达式的学习关键在于“理论与实践相结合”。理解元字符的含义是基础,而通过大量实践在grepsedawk等工具中灵活运用,才能真正掌握这门文本处理的利器,为后续更深入的Shell编程和系统管理工作做好准备。


网站公告

今日签到

点亮在社区的每一天
去签到