Linux操作系统基础 – 正则表达式快速入门
Linux Operating System Essentials - Introduction to Regular Expressions
通常在计算机科学领域,正则表达式被解释为对字符串操作的一种逻辑公式,即用事先定义好的特定字符及其组合组成所谓的“规则字符串”,而我们用它来表达对字符串的一种过滤逻辑。
规划这种过滤逻辑的用途,是查找和匹配特定文本中的字符串,从而进行和优化内容分析,使工作提高效率。
本文将介绍正则表达式的匹配规则和应用案例,并用grep工具实现正则表达式的各种功能。
0. 正则表达式匹配字符
正则表达式模式匹配字符及配合使用的Quantifier(量词)和控制字符有其自身的作用,例如:
1. Grep与正则表达式
grep 是 Linux 中最有用并且非常强大的文本处理命令之一。grep 可以在一个或多个输入文件中搜索与正则表达式匹配的行,并将每个匹配行写入标准输出。
在本文中,我们将探讨如何在 GNU 版本的 grep 中使用正则表达式的基础知识,该版本在大多数 Linux 操作系统中默认可用。
Regular Expressions (或 正则表达式) 是与一组字符串匹配的模式。模式由运算符、构造文字字符和元字符组成,它们具有特殊含义。GNU grep
支持三种正则表达式语法:基本、扩展和 Perl 兼容。
在最简单的形式中,当没有给出正则表达式类型时,grep 将搜索模式解释为基本正则表达式。若要将模式解释为扩展正则表达式,请使用 -E(或 --extended-regexp)选项。
在 GNU 的 grep 实现中,基本正则表达式语法和扩展正则表达式语法之间没有功能上的区别。唯一的区别是,在基本正则表达式中,元字符 ?、+、{、|、( 和 ) 被解释为文字字符。为了在使用基本正则表达式时保留元字符的特殊含义,必须使用反斜杠 () 对字符进行转义。我们稍后将解释这些元字符和其他元字符的含义。
通常,应始终将正则表达式括在单引号(‘ ’)中,以避免 shell 对元字符的解释和扩展。
2. 匹配字面量(Matching Literals)
grep 命令的最基本用法是在文件中搜索文字字符或一系列字符。例如,如果需要在 /etc/passwd 文件中显示包含字符串“bash”的所有行,请运行以下命令:
# grep bash etc/passwd
执行结果如下图所示:
在此示例中,字符串“bash”是一个基本正则表达式,由四个文本字符组成。这个命令告诉 grep 搜索一个字符串,该字符串后面跟着**“a”、“s”和“h”。**
默认情况下,grep 命令区分大小写。这意味着大写和小写字符被视为不同的字符。
要在搜索时忽略大小写,请使用 -i 选项(或 --ignore-case)。
需要注意的是,grep 将搜索模式查找为字符串,而不是单词。因此,如果你正在搜索 “ok”,grep 也会打印 “ok” 嵌入在较大单词中的行,例如 “look” 或 “cook”。
如果搜索字符串包含空格,则需要将其括在单引号或双引号中,见如下示例:
# grep “Gnome Display Manager” /etc/passwd
3. 锚固(Anchoring)
锚点是元字符,可用于指定必须在行中找到匹配项的位置。
^(插入符号)与行首的空字符串匹配。在以下示例中,仅当字符串“linux”出现在一行的开头时,它才会匹配。我们先看一下要过滤的文本文档file.txt内容:
Looking to get started in Linux? Develop a good working knowledge of Linux using both the graphical interface and command line across the major Linux distribution families with The Linux Foundation’s Intro to Linux online course. Enroll for free here.
尝试用以下grep命令从file.txt过滤不同需求的字符串。
grep “Linux” file.txt
执行结果如下:
grep '^linux' file.txt
$(美元)符号与行首的空字符串匹配。要查找以字符串“linux”结尾的行,请使用:
例如:
grep 'linux$' file.txt
您还可以使用两个锚点构造正则表达式。例如,若要查找仅包含“linux”的行,请运行:
grep '^linux$' file.txt
另一个有用的示例是匹配所有空行的 ^$ 模式。
4. 匹配单个字符
这个"."(句点)符号是与任何单个字符匹配的元字符。例如,若要匹配以“kan”开头、包含两个字符并以字符串“roo”结尾的任何内容,请使用以下模式:
grep 'kan..roo' file.txt
5. grep accept[np]t**
括号表达式
括号表达式允许通过将一组字符括在方括号 [ ] 内来匹配这些字符。例如,查找包含“accept”或“accent”的行,可以使用以下表达式:
grep 'acce[np]t' file.txt
如果括号内的第一个字符是插入符号 ^,则它与括号中未括起来的任何单个字符匹配。以下模式将匹配以“co”开头的字符串的任意组合,后跟除“l”后跟“la”以外的任何字母,例如“coca”、“cobalt”等,但与包含“cola”的行不匹配:
grep 'co[^l]a' file.txt
您可以在括号内指定一系列字符,而不是逐个放置字符。范围表达式是通过指定范围的第一个和最后一个字符来构造的,这些字符用连字符分隔。例如,[a-e] 等同于 [abcde],[1-3] 等同于 [123]。
以下表达式匹配以大写字母开头的每一行:
grep '^ 范围表达式‘ file.txt
6. Quantifier(量词)
限定符允许您指定匹配项的出现次数,这些项必须存在才能发生匹配。下表显示了 GNU grep 支持的量词:
限定符允许您指定匹配项的出现次数,这些项必须存在才能发生匹配。下表显示了 GNU grep 支持的量词:
Quantifier Description
(*) 将前一项匹配零次或多次。(不含括号)
? 将前一项匹配零次或一次。
(+) 匹配前一项一次或多次。(不含括号)
{n} 将前一项精确匹配n次。
{n,} 匹配前一项至少n次。。
{,m} 最多匹配前一项 m 次。
{n,m} 从 n 次到 m 次匹配前项。
*(星号)字符与前一项匹配零次或多次。例如,以下命令将匹配“right”、“sright”、“ssright”
等:
grep 's*right'
下面是更高级的模式,它匹配所有以大写字母开头并以句点或逗号结尾的行。.* 正则表达式匹配任意数量的任意字符:
grep -E '^[A-Z].*[.,]$' file.txt
?(问号)字符使前一项可选,并且只能匹配一次。以下内容将同时匹配“明亮”和“正确”。这?字符使用反斜杠转义,因为我们使用的是基本的正则表达式:
grep 'b?right' file.txt
以下是使用扩展正则表达式的相同正则表达式:
grep -E 'b?right' file.txt
+(加号)字符与前一项匹配一次或多次。以下内容将匹配“sright”和“ssright”,但不匹配“right”:
grep -E 's+right' file.txt
大括号字符 {} 允许您指定匹配发生所必须发生的确切数字、上限或下限或出现次数范围。
以下命令将匹配 3 到 9 位之间的所有整数:
grep -E '[[:d igit:]]{3,9}' file.txt
7.交替
1.术语交替是一个简单的“OR”。交替运算符 |(pipe) 允许您指定不同的可能匹配项,这些匹配项可以是文本字符串或表达式集。此运算符在所有正则表达式运算符中具有最低的优先级。
在下面的示例中,
如果使用扩展正则表达式,则运算符 |不应转义,如下所示:
grep -E 'fatal|| error| critical' /var/log/nginx/error.log
8.分组
分组是正则表达式的一项功能,允许您将模式组合在一起并将它们作为一个项目引用。使用括号() 创建组。
使用基本正则表达式时,括号必须使用反斜杠 () 进行转义。
以下示例同时匹配“fearless”和“less”。这个?量词使 (fear) 组可选:
grep -E '(fear)?less' file.txt
9. 特殊反斜杠表达式
GNU grep 包含几个元字符,由一个反斜杠和一个常规字符组成。下表显示了一些最常见的特殊反斜杠表达式:
附:表达式说明
b 匹配单词边界。
< 匹配单词开头的空字符串。 > 匹配单词末尾的空字符串。 w 匹配一个单词。 s 匹配空格。
此模式将匹配单独的单词“abject”和“object”。如果嵌入到较大的单词中,它将与单词不匹配:
grep 'b[ao]bjectb' file.txt
10. 小结
正则表达式用于文本编辑器、编程语言和命令行工具,例如 grep、sed 和 awk 。了解如何构造正则表达式在搜索文本文件、同时在编写脚本或过滤命令输出时非常有用。(参考资料:Linuxize.com)
技术好文陆续推出,敬请关注。
喜欢就点赞哈。😊