zhcn 技术 手机 Grep 和正则表达式:如何有效地使用它们?

Grep 和正则表达式:如何有效地使用它们?

如果您已经使用 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 将其视为元字符。

对于不区分大小写的搜索,请使用带-i参数的 grep。

 $ grep -i ‘tech’ tech.txt 

此命令搜索字符串“tech”的实例,无论是完整的还是部分的,不区分大小写。

要显示不包含指定模式的所有行,必须使用-v参数。

 $ grep -v ‘tech’ tech.txt 

输出显示所有不包含单词“ tech ”的行。您还会看到一个空行。这些行是段落之后的行。

要执行递归搜索,请在 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 递归搜索日志文件
grep 递归搜索日志文件

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 正则表达式匹配
文字单词与 grep 正则表达式匹配

同样,您也可以使用文字匹配来搜索当前用户。为此,运行

 $ grep bash /etc/passwd
 #output

root:x:0:0:root:/root:/bin/bash

nitt:x:1000:1000:,,,:/home/nitt:/bin/bash 
grep 正则表达式 bash 当前用户
grep 正则表达式 bash 当前用户

这将显示谁有权访问 bash。

#2.锚点匹配

锚点匹配是使用特殊字符进行高级搜索的有用技术。正则表达式具有多种锚定字符,可用于表示文本中的特定位置。这些包括:

  • ^’ 插入符号:插入符号与输入字符串或输入行的开头匹配,并搜索空字符串。
  • $’ 美元符号:美元符号匹配输入字符串或输入行的末尾并搜索空字符串。

另外两个锚匹配字符包括’\b’单词边界和’\B’非单词边界。

  • ‘\b’ 单词边界: \b 可用于声明单词和非单词字符之间的位置。简单来说,就是可以匹配完整的单词。这样你就可以避免部分匹配。您还可以使用它来替换单词并计算字符串中单词的出现次数。
  • \B 非单词边界:这是正则表达式中 \bWord 边界的逆,因为它断言不在两个单词或非单词字符之间的位置。

让我们看一个例子来获得一个清晰的想法。

 $ grep ‘^From’ tech.txt 
grep 插入符锚点
grep 插入符锚点

要使用插入符号,您必须以正确的大小写键入单词或模式。这是因为它区分大小写。因此,运行以下命令不会返回任何内容。

 $ grep ‘^from’ tech.txt

同样,您可以使用 $ 符号来搜索与特定模式、字符串或单词匹配的句子。

 $ grep ‘technology.$' tech.txt 
grep 美元锚
grep 美元锚

您还可以组合使用 ^ 和 $ 符号。让我们看一下下面的例子。

 $ grep “^From \| technology.$” tech.txt 
grep 插入符号美元
grep 插入符号美元

如您所见,输出包括以“From”开头的句子和以“technology”结尾的句子。

#3。分组

如果您想一次搜索多个模式,您应该使用分组。这对于创建可被视为单个单元的小组字符或图案非常有用。例如,您可以创建一个包含术语“t”、“e”、“c”和“h”的组 (tech)。

让我们看一个例子来获得一个清晰的想法。

 $ grep 'technol\(ogy\)\?' tech.txt 
grep 分组示例
grep 分组示例

分组允许您匹配重复模式、捕获组并查找替代方案。

通过分组进行替代搜索

让我们看一下替代搜索的示例。

 $ grep "\(tech\|technology\)" tech.txt 
grep 替代搜索
grep 替代搜索

如果要对字符串执行搜索,则必须使用管道符号传递该字符串。让我们看一下下面的例子。

 $ echo “tech technological technologies technical” |  grep "\(tech\|technology\)"
 #output

“tech technological technologies technical” 
grep 搜索字符串
grep 搜索字符串

捕获组、非捕获组和重复模式

被俘虏和未被俘虏的群体会怎样?

您需要使用正则表达式创建一个组,并将其传递给捕获该组的字符串或文件。

 $ echo 'tech655 tech655nical technologies655 tech655-oriented 655' | grep "\(tech\)\(655\)"
 #output

tech655 tech655nical technologies655 tech655-oriented 655 
grep 捕获组
grep 捕获组

另外,对于非捕获组,必须在括号内使用 ?:。

最后,还有重复的模式。要检查重复模式,您需要修改正则表达式。

 $ 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 数字字符类示例
grep 数字字符类示例
 $ grep [[:alpha:]] tech.txt 
grep 字母字符类示例
grep 字母字符类示例
 $ grep [[:xdigit:]] tech.txt 
grep xdigital 字符类示例
grep xdigital 字符类示例

#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代表扩展正则表达式(稍后会详细介绍)。

量词 grep
量词 grep

#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 
PCR 电子邮件示例
PCR 电子邮件示例

在这里,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 
PCRE日期
PCRE日期

此命令搜索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 面试问题和答案。

如果您已经使用 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 将其视为元字符。

对于不区分大小写的搜索,请使用带-i参数的 grep。

 $ grep -i ‘tech’ tech.txt 

此命令搜索字符串“tech”的实例,无论是完整的还是部分的,不区分大小写。

要显示不包含指定模式的所有行,必须使用-v参数。

 $ grep -v ‘tech’ tech.txt 

输出显示所有不包含单词“ tech ”的行。您还会看到一个空行。这些行是段落之后的行。

要执行递归搜索,请在 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 递归搜索日志文件
grep 递归搜索日志文件

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 正则表达式匹配
文字单词与 grep 正则表达式匹配

同样,您也可以使用文字匹配来搜索当前用户。为此,运行

 $ grep bash /etc/passwd
 #output

root:x:0:0:root:/root:/bin/bash

nitt:x:1000:1000:,,,:/home/nitt:/bin/bash 
grep 正则表达式 bash 当前用户
grep 正则表达式 bash 当前用户

这将显示谁有权访问 bash。

#2.锚点匹配

锚点匹配是使用特殊字符进行高级搜索的有用技术。正则表达式具有多种锚定字符,可用于表示文本中的特定位置。这些包括:

  • ^’ 插入符号:插入符号与输入字符串或输入行的开头匹配,并搜索空字符串。
  • $’ 美元符号:美元符号匹配输入字符串或输入行的末尾并搜索空字符串。

另外两个锚匹配字符包括’\b’单词边界和’\B’非单词边界。

  • ‘\b’ 单词边界: \b 可用于声明单词和非单词字符之间的位置。简单来说,就是可以匹配完整的单词。这样你就可以避免部分匹配。您还可以使用它来替换单词并计算字符串中单词的出现次数。
  • \B 非单词边界:这是正则表达式中 \bWord 边界的逆,因为它断言不在两个单词或非单词字符之间的位置。

让我们看一个例子来获得一个清晰的想法。

 $ grep ‘^From’ tech.txt 
grep 插入符锚点
grep 插入符锚点

要使用插入符号,您必须以正确的大小写键入单词或模式。这是因为它区分大小写。因此,运行以下命令不会返回任何内容。

 $ grep ‘^from’ tech.txt

同样,您可以使用 $ 符号来搜索与特定模式、字符串或单词匹配的句子。

 $ grep ‘technology.$' tech.txt 
grep 美元锚
grep 美元锚

您还可以组合使用 ^ 和 $ 符号。让我们看一下下面的例子。

 $ grep “^From \| technology.$” tech.txt 
grep 插入符号美元
grep 插入符号美元

如您所见,输出包括以“From”开头的句子和以“technology”结尾的句子。

#3。分组

如果您想一次搜索多个模式,您应该使用分组。这对于创建可被视为单个单元的小组字符或图案非常有用。例如,您可以创建一个包含术语“t”、“e”、“c”和“h”的组 (tech)。

让我们看一个例子来获得一个清晰的想法。

 $ grep 'technol\(ogy\)\?' tech.txt 
grep 分组示例
grep 分组示例

分组允许您匹配重复模式、捕获组并查找替代方案。

通过分组进行替代搜索

让我们看一下替代搜索的示例。

 $ grep "\(tech\|technology\)" tech.txt 
grep 替代搜索
grep 替代搜索

如果要对字符串执行搜索,则必须使用管道符号传递该字符串。让我们看一下下面的例子。

 $ echo “tech technological technologies technical” |  grep "\(tech\|technology\)"
 #output

“tech technological technologies technical” 
grep 搜索字符串
grep 搜索字符串

捕获组、非捕获组和重复模式

被俘虏和未被俘虏的群体会怎样?

您需要使用正则表达式创建一个组,并将其传递给捕获该组的字符串或文件。

 $ echo 'tech655 tech655nical technologies655 tech655-oriented 655' | grep "\(tech\)\(655\)"
 #output

tech655 tech655nical technologies655 tech655-oriented 655 
grep 捕获组
grep 捕获组

另外,对于非捕获组,必须在括号内使用 ?:。

最后,还有重复的模式。要检查重复模式,您需要修改正则表达式。

 $ 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 数字字符类示例
grep 数字字符类示例
 $ grep [[:alpha:]] tech.txt 
grep 字母字符类示例
grep 字母字符类示例
 $ grep [[:xdigit:]] tech.txt 
grep xdigital 字符类示例
grep xdigital 字符类示例

#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代表扩展正则表达式(稍后会详细介绍)。

量词 grep
量词 grep

#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 
PCR 电子邮件示例
PCR 电子邮件示例

在这里,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 
PCRE日期
PCRE日期

此命令搜索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 面试问题和答案。