如果您已经使用 Linux 一段时间,您可能已经熟悉 grep(全局正则表达式打印),这是一种可用于搜索文件和目录的文本处理工具。对于 Linux 高级用户非常有用。但是,如果不使用正则表达式,其功能可能会受到限制。
但什么是正则表达式呢?
Regex 是一个正则表达式,可用于改进 grep 搜索功能。根据定义,正则表达式是复杂的输出过滤模式。通过练习,您可以有效地使用正则表达式,就像在其他 Linux 命令中使用它们一样。
在本教程中,您将学习如何有效地使用 Grep 和 Regex。
先决条件
将 grep 与正则表达式结合使用需要对 Linux 有很好的了解。如果您是初学者,请查看我们的 Linux 指南。
您还需要一台运行 Linux 操作系统的笔记本电脑或计算机。您可以使用任何 Linux 发行版。此外,如果您有 Windows 计算机,您仍然可以将 Linux 与 WSL2 结合使用。单击此处了解更多信息。
一旦您有权访问命令行/终端,您就可以运行 grep/regex 教程中提供的所有命令。
此外,您将需要访问运行示例所需的文本文件。我用ChatGPT生成了一面文字墙,让他们写一些关于技术的内容。我使用的提示如下。
“生成 400 个有关技术的单词。应包含大多数技术。此外,请务必在整个文本中重复技术名称。”
生成文本后,我将其复制并粘贴并将其保存到 tech.txt 文件中。该文件将在整个教程中使用。
最后,了解 grep 命令的基础知识非常重要。查看 16 个 grep 命令示例来刷新您的知识。我们还将简要介绍 grep 命令来帮助您入门。
grep 命令语法和示例
grep命令的语法很简单。
$ grep -options [regex/pattern] [files]如您所见,我们需要一个模式和一个文件列表来运行命令。
有许多 grep 选项可以修改其功能。这些包括:
- –i:不区分大小写
- -r:执行递归搜索
- -w:执行仅搜索整个单词的搜索。
- -v:显示所有不匹配的行
- -n:显示所有匹配的行号。
- -l:输出文件名。
- –color:彩色结果输出
- -c:显示所用模式的匹配数
#1.搜索整个单词
要搜索整个单词,您需要在 grep 中使用 -w 参数。这允许您绕过与指定模式匹配的字符串。
$ grep -w ‘tech\|5G’ tech.txt 如您所见,此命令的输出在整个文本中搜索两个单词:“5G”和“tech”。然后将它们标记为红色。
这里,|管道符号被转义以防止 grep 将其视为元字符。
#2.不区分大小写的搜索
对于不区分大小写的搜索,请使用带-i参数的 grep。
$ grep -i ‘tech’ tech.txt 此命令搜索字符串“tech”的实例,无论是完整的还是部分的,不区分大小写。
#3。执行不匹配的行搜索
要显示不包含指定模式的所有行,必须使用-v参数。
$ grep -v ‘tech’ tech.txt 输出显示所有不包含单词“ tech ”的行。您还会看到一个空行。这些行是段落之后的行。
#4。执行递归搜索
要执行递归搜索,请在 grep 中使用-r参数。
$ grep -R ‘error\|warning’ /var/log/*.log #output
/var/log/bootstrap.log:2023-01-03 21:40:18 URL:http://ftpmaster.internal/ubuntu/pool/main/libg/libgpg-error/libgpg-erro 0_1.43-3_amd64.deb [69684/69684] -> "/build/chroot//var/cache/apt/archives/partial/libgpg-error0_1.43-3_amd64.deb" [1]
/var/log/bootstrap.log:dpkg: warning: parsing file '/var/lib/dpkg/status' near line 5 package 'dpkg':
/var/log/bootstrap.log:dpkg: warning: parsing file '/var/lib/dpkg/status' near line 5 package 'dpkg':
/var/log/bootstrap.log:dpkg: warning: parsing file '/var/lib/dpkg/status' near line 24 package 'dpkg':
/var/log/bootstrap.log:dpkg: warning: parsing file '/var/lib/dpkg/status' near line 24 package 'dpkg':
/var/log/bootstrap.log:dpkg: warning: ignoring pre-dependency problem! 
grep 命令在 /var/log 目录中递归搜索“error”和“warning”这两个单词。这是一个有用的命令,用于检查日志文件中的警告和错误。
Grep 和正则表达式:概述和示例
由于我们在这里使用正则表达式,因此您应该知道正则表达式具有三种语法选项。这些包括:
- 基本正则表达式 (BRE)
- 扩展正则表达式 (ERE)
- Pearl 兼容正则表达式 (PCRE)
grep 命令使用 BRE 作为默认选项。因此,如果您想使用其他正则表达式模式,则需要提及它们。 grep 命令也按原样处理元字符。因此,如果使用 ?、+、) 等元字符,则必须使用反斜杠 (\) 命令对其进行转义。
使用正则表达式的 grep 语法为:
$ grep [regex] [filenames]让我们在下面的示例中看看 grep 和 regex 的实际应用。
#1.文字匹配
要匹配文字单词,您必须将字符串指定为正则表达式。毕竟,单词也是正则表达式。
$ grep "technologies" tech.txt 
同样,您也可以使用文字匹配来搜索当前用户。为此,运行
$ grep bash /etc/passwd #output
root:x:0:0:root:/root:/bin/bash
nitt:x:1000:1000:,,,:/home/nitt:/bin/bash 
这将显示谁有权访问 bash。
#2.锚点匹配
锚点匹配是使用特殊字符进行高级搜索的有用技术。正则表达式具有多种锚定字符,可用于表示文本中的特定位置。这些包括:
- ‘ ^’ 插入符号:插入符号与输入字符串或输入行的开头匹配,并搜索空字符串。
- ‘ $’ 美元符号:美元符号匹配输入字符串或输入行的末尾并搜索空字符串。
另外两个锚匹配字符包括’\b’单词边界和’\B’非单词边界。
- ‘\b’ 单词边界: \b 可用于声明单词和非单词字符之间的位置。简单来说,就是可以匹配完整的单词。这样你就可以避免部分匹配。您还可以使用它来替换单词并计算字符串中单词的出现次数。
- \B 非单词边界:这是正则表达式中 \bWord 边界的逆,因为它断言不在两个单词或非单词字符之间的位置。
让我们看一个例子来获得一个清晰的想法。
$ grep ‘^From’ tech.txt 
要使用插入符号,您必须以正确的大小写键入单词或模式。这是因为它区分大小写。因此,运行以下命令不会返回任何内容。
$ grep ‘^from’ tech.txt同样,您可以使用 $ 符号来搜索与特定模式、字符串或单词匹配的句子。
$ grep ‘technology.$' tech.txt 
您还可以组合使用 ^ 和 $ 符号。让我们看一下下面的例子。
$ grep “^From \| technology.$” tech.txt 
如您所见,输出包括以“From”开头的句子和以“technology”结尾的句子。
#3。分组
如果您想一次搜索多个模式,您应该使用分组。这对于创建可被视为单个单元的小组字符或图案非常有用。例如,您可以创建一个包含术语“t”、“e”、“c”和“h”的组 (tech)。
让我们看一个例子来获得一个清晰的想法。
$ grep 'technol\(ogy\)\?' tech.txt 
分组允许您匹配重复模式、捕获组并查找替代方案。
通过分组进行替代搜索
让我们看一下替代搜索的示例。
$ grep "\(tech\|technology\)" tech.txt 如果要对字符串执行搜索,则必须使用管道符号传递该字符串。让我们看一下下面的例子。
$ echo “tech technological technologies technical” | grep "\(tech\|technology\)" #output
“tech technological technologies technical” 
捕获组、非捕获组和重复模式
被俘虏和未被俘虏的群体会怎样?
您需要使用正则表达式创建一个组,并将其传递给捕获该组的字符串或文件。
$ echo 'tech655 tech655nical technologies655 tech655-oriented 655' | grep "\(tech\)\(655\)" #output
tech655 tech655nical technologies655 tech655-oriented 655 
另外,对于非捕获组,必须在括号内使用 ?:。
最后,还有重复的模式。要检查重复模式,您需要修改正则表达式。
$ echo ‘teach tech ttrial tttechno attest’ | grep '\(t\+\)' #output
‘teach tech ttrial tttechno attest’此处,正则表达式搜索“t”字符的一个或多个实例。
#4。字符类
字符类使创建正则表达式变得容易。这些字符类使用方括号。一些著名的字符类是:
- [:数字:] – 0 到 9 位数字
- [:alpha:] – 字母字符
- [:alnum:] – 字母数字字符
- [: lower:] – 小写
- [:upper:] – 大写
- [:xdigit:] – 十六进制,包括 0-9、AF、AF
- [:blank:] – 空白字符,例如制表符和空格
等等!
让我们检查一些操作。
$ grep [[:digit]] tech.txt 
$ grep [[:alpha:]] tech.txt $ grep [[:xdigit:]] tech.txt #5。量词
量词是元字符,是正则表达式的核心。这些可以让您完全匹配外观。下面让我们来看看它们。
- * → 0 或更多匹配项
- + → 一场或多场比赛
- ? → 0 或 1 匹配
- {x} → x 匹配
- {x, } → x 或更多匹配项
- {x,z} → 从 x 到 z 的匹配
- {, z} → 最多 z 匹配
$ echo ‘teach tech ttrial tttechno attest’ | grep -E 't+' #output
‘teach tech ttrial tttechno attest’在这里,我们搜索“ t”字符实例以查找一个或多个匹配项。这里-E代表扩展正则表达式(稍后会详细介绍)。
#6。扩展正则表达式
如果您不想向正则表达式模式添加转义字符,则应使用扩展正则表达式。这消除了添加转义字符的需要。为此,您必须使用 -E 标志。
$ grep -E 'in+ovation' tech.txt 
#7.使用 PCRE 执行复杂搜索
PCRE(Perl 兼容正则表达式)允许您做的不仅仅是创建基本表达式。例如,可以写“\d”来表示[0-9]。
例如,您可以使用 PCRE 搜索电子邮件地址。
echo "Contact me at nitish@newdomain.com" | grep -P "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b" #output
Contact me at nitish@newdomain.com 
在这里,PCRE 检查模式是否匹配。同样,您还可以使用 PCRE 模式检查日期模式。
$ echo "The Sparkain site launched on 2023-07-29" | grep -P "\b\d{4}-\d{2}-\d{2}\b" #output
The Sparkain site launched on 2023-07-29 
此命令搜索YYYY-MM-DD格式的日期。您还可以更改它以匹配其他日期格式。
#8。替代品
如果您想要不同的匹配,可以使用转义管道字符 (\|)。
$ grep -L ‘warning\|error’ /var/log/*.log #output
/var/log/alternatives.log
/var/log/bootstrap.log
/var/log/dpkg.log
/var/log/fontconfig.log
/var/log/ubuntu-advantage.log
/var/log/upgrade-policy-changed.log输出将列出包含“警告”或“错误”的文件名。

最后一句话
我们的 grep 和正则表达式指南到此结束。您可以广泛使用 grep 和正则表达式来缩小搜索范围。如果使用得当,它可以节省大量时间并帮助自动化许多任务。当用于编写脚本或在对文本执行搜索时使用正则表达式时,它特别有用。
接下来,查看一些常见的 Linux 面试问题和答案。




![2021 年如何设置 Raspberry Pi Web 服务器 [指南]](https://i0.wp.com/pcmanabu.com/wp-content/uploads/2019/10/web-server-02-309x198.png?w=1200&resize=1200,0&ssl=1)

