Egrep 与正则表达式入门教程
Egrep 与正则表达式入门教程
还在为从海量文本中查找特定信息而烦恼吗?本教程将带你领略 egrep
命令和正则表达式的强大威力,通过丰富的实例,让你轻松入门,成为数据筛选高手!
引言
正则表达式(Regular Expressions,常简写为 REs)是许多命令行工具和编程语言中的一个核心概念。初次接触时,它那些特殊的符号和规则可能会让人感到困惑。别担心,这很正常!
最好的学习方法是:先通读一遍教程,跟着例子在你的终端里亲自敲一敲、试一试。然后,可以先放一放,过一两天再回来看。你会惊奇地发现,很多之前模糊的概念在第二次学习时会变得清晰起来。掌握正则表达式没有捷径,唯有时间和练习。
它们究竟是什么?
正则表达式是一种用来描述、匹配一系列符合某个句法规则的字符串的“模式 (pattern)”。你可以把它想象成我们之前学习过的通配符(如 *
和 ?
),但功能要强大得多。
通配符主要用于匹配文件名,而正则表达式则可以用于识别和处理任何文本数据中特定的片段,例如,从一个巨大的日志文件中找出所有的电子邮件地址、IP 地址或者特定格式的错误信息。
正则表达式的应用无处不在。在本教程中,我们将使用 egrep
命令来演示它,但实际上,许多其他工具(如 sed
、awk
、vi
/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
学习与排错技巧
在学习过程中,模式写错是很常见的。如果结果不符合预期(比如匹配了所有行,或一行都没匹配),不要灰心。试试以下策略:
- 检查拼写和语法:最常见的问题就是打字错误。
- 分解模式:将复杂的正则表达式拆分成几个小部分,分别测试每一部分是否能按预期工作。
- 分析输出:即使输出不正确,它也能提供线索。看看它实际匹配到了什么,反思为什么会匹配到这些内容,这能帮你修正模式。
- 利用在线工具:像 Debuggex 或 Regex101 这样的在线工具可以让你实时测试正则表达式,并提供可视化的解释,对理解其工作原理非常有帮助。
总结
-
egrep
: 一个强大的命令行工具,用于筛选出符合特定模式的文本行。 -
正则表达式
: 一套用于定义搜索模式的强大语法,是处理文本数据的必备技能。
动手练习
现在轮到你了!
- 首先,确保你已经创建了
mysampledata.txt
文件。 - 亲自尝试并修改上面“实战演练”中的所有例子,看看改变模式会如何影响结果。
- 查阅
egrep
的手册页(在终端输入man egrep
),尝试使用至少 2 个本教程未提及的命令行选项,例如-i
(忽略大小写)或-w
(匹配整个单词)。