Egrep 与正则表达式入门教程

发布于 2025-09-27 分类: Linux

Egrep 与正则表达式入门教程

还在为从海量文本中查找特定信息而烦恼吗?本教程将带你领略 egrep 命令和正则表达式的强大威力,通过丰富的实例,让你轻松入门,成为数据筛选高手!

引言

正则表达式(Regular Expressions,常简写为 REs)是许多命令行工具和编程语言中的一个核心概念。初次接触时,它那些特殊的符号和规则可能会让人感到困惑。别担心,这很正常!

最好的学习方法是:先通读一遍教程,跟着例子在你的终端里亲自敲一敲、试一试。然后,可以先放一放,过一两天再回来看。你会惊奇地发现,很多之前模糊的概念在第二次学习时会变得清晰起来。掌握正则表达式没有捷径,唯有时间和练习。

它们究竟是什么?

正则表达式是一种用来描述、匹配一系列符合某个句法规则的字符串的“模式 (pattern)”。你可以把它想象成我们之前学习过的通配符(如 *?),但功能要强大得多。

通配符主要用于匹配文件名,而正则表达式则可以用于识别和处理任何文本数据中特定的片段,例如,从一个巨大的日志文件中找出所有的电子邮件地址、IP 地址或者特定格式的错误信息。

正则表达式的应用无处不在。在本教程中,我们将使用 egrep 命令来演示它,但实际上,许多其他工具(如 sedawkvi/vim)以及绝大多数编程语言(如 Python, JavaScript, Java)都广泛支持正则表达式。

Egrep 命令入门

egrep 是一个强大的文本搜索工具,它能扫描给定的文件或数据流,并打印出每一行中包含特定“模式”的内容。它是 grep 命令的扩展版本(egrep 的 'e' 代表 "extended",即扩展的正则表达式)。

egrep 的基本语法如下:

egrep [选项] '模式' [文件路径]

注意:我们强烈建议始终用单引号 ' ' 将你的正则表达式模式括起来。这可以防止 Shell(命令行解释器)错误地解析模式中的特殊字符(例如 *, $, | 等)。

准备示例数据

为了更好地进行后续的练习,请首先创建一个名为 mysampledata.txt 的文件,并将以下内容复制进去:

Fred apples 20
Susy oranges 5
Mark watermellons 12
Robert pears 4
Terry oranges 9
Lisa peaches 7
Susy oranges 12
Mark grapes 39
Anne mangoes 7
Greg pineapples 3
Oliver rockmellons 2
Betty limes 14

基本用法

egrep 的最基本功能是查找包含某个固定字符串的行。例如,我们想找到所有包含 "mellon" 字符串的行:

egrep 'mellon' mysampledata.txt

输出将会是:

Mark watermellons 12
Oliver rockmellons 2

egrep 默认会打印出匹配成功的整行内容。

常用选项

egrep 有许多实用的选项可以改变其行为:

  • -n: 显示匹配行的行号。

    egrep -n 'mellon' mysampledata.txt
    

    输出:

    3:Mark watermellons 12
    11:Oliver rockmellons 2
    
  • -c: 不显示匹配的行,只统计匹配到的总行数。

    egrep -c 'mellon' mysampledata.txt
    

    输出:

    2
    
  • -v: 反向匹配,即打印出所有不包含模式的行。

正则表达式核心语法概览

正是这些特殊字符(元字符)赋予了正则表达式强大的能力。下面是入门阶段最常用的一些元字符:

符号 名称/说明 示例解释
. 点 (dot) 匹配任意单个字符(除了换行符)。
* 星号 (asterisk) 匹配前一个元素 0 次或多次
+ 加号 (plus) 匹配前一个元素 1 次或多次
? 问号 (question mark) 匹配前一个元素 0 次或 1 次
{n} 花括号 (curly braces) 匹配前一个元素恰好 n 次
{n,m} 同上 匹配前一个元素至少 n 次,但不超过 m 次{n,} 表示至少n次。
[abc] 字符集 (character set) 匹配方括号中任意一个字符。例如 [agd] 匹配 'a' 或 'g' 或 'd'。
[^abc] 排除型字符集 匹配除了方括号中字符以外的任意一个字符。
[a-z] 范围 (range) 匹配指定范围内的任意一个字符。例如 [c-f] 匹配 'c','d','e','f'。
() 分组 (grouping) 将多个字符组合成一个单元,可以对这个单元使用量词(如 *, +)。
| 或 (OR) 逻辑“或”操作。匹配 | 左边或右边的表达式。
^ 行首锚定 (caret) 匹配一行的开始位置。
$ 行尾锚定 (dollar) 匹配一行的结束位置。

实战演练

学习语法的最好方式就是通过实例。让我们用上面的示例文件来实践一下。

示例 1:查找包含连续两个或以上元音字母的行

这里,[aeiou] 定义了匹配的元素(任意一个元音字母),{2,} 这个量词表示前面的元素(即元音字母)需要连续出现至少 2 次。

egrep '[aeiou]{2,}' mysampledata.txt

输出:

Robert pears 4
Lisa peaches 7
Anne mangoes 7
Greg pineapples 3

示例 2:查找包含数字 "2" 且 "2" 后面还有其他字符的行

2 匹配字符 "2",. 匹配任意单个字符,+ 表示前面的元素(.)必须出现 1 次或多次。所以 2.+ 的意思是“一个2,后面跟着至少一个任意字符”。

egrep '2.+' mysampledata.txt

输出:

Fred apples 20

示例 3:查找以数字 "2" 结尾的行

$ 是行尾锚定符,所以 2$ 的意思就是“一行的结尾必须是字符2”。

egrep '2$' mysampledata.txt

输出:

Mark watermellons 12
Susy oranges 12
Oliver rockmellons 2

示例 4:查找包含 "or" 或 "is" 或 "go" 的行

| 符号在这里起到了逻辑“或”的作用。

egrep 'or|is|go' mysampledata.txt

输出:

Susy oranges 5
Terry oranges 9
Lisa peaches 7
Susy oranges 12
Anne mangoes 7

示例 5:查找所有名字以 A 到 K 之间的大写字母开头的行

^ 是行首锚定符,[A-K] 是一个范围字符集,表示从 'A' 到 'K' 之间的任意一个大写字母。

egrep '^[A-K]' mysampledata.txt

输出:

Fred apples 20
Anne mangoes 7
Greg pineapples 3
Betty limes 14

学习与排错技巧

在学习过程中,模式写错是很常见的。如果结果不符合预期(比如匹配了所有行,或一行都没匹配),不要灰心。试试以下策略:

  1. 检查拼写和语法:最常见的问题就是打字错误。
  2. 分解模式:将复杂的正则表达式拆分成几个小部分,分别测试每一部分是否能按预期工作。
  3. 分析输出:即使输出不正确,它也能提供线索。看看它实际匹配到了什么,反思为什么会匹配到这些内容,这能帮你修正模式。
  4. 利用在线工具:像 DebuggexRegex101 这样的在线工具可以让你实时测试正则表达式,并提供可视化的解释,对理解其工作原理非常有帮助。

总结

  • egrep
    : 一个强大的命令行工具,用于筛选出符合特定模式的文本行。

  • 正则表达式
    : 一套用于定义搜索模式的强大语法,是处理文本数据的必备技能。

动手练习

现在轮到你了!

  • 首先,确保你已经创建了 mysampledata.txt 文件。
  • 亲自尝试并修改上面“实战演练”中的所有例子,看看改变模式会如何影响结果。
  • 查阅 egrep 的手册页(在终端输入 man egrep),尝试使用至少 2 个本教程未提及的命令行选项,例如 -i(忽略大小写)或 -w(匹配整个单词)。

-- 感谢阅读 --