网站搜索

使用grep、sed和awk命令的16个Bash正则表达式(RegEx)示例


正则表达式或 Regex 是一系列特殊字符的组合,形成一个模式,用于从文件中查找特定的模式匹配实例并对其进行操作。它主要用于在文件中搜索特定字符、单词、过滤或文本操作。

正则表达式在包括Linux Bash脚本在内的编程语言中广泛使用。在本指南中,我将介绍如何在Bash中使用正则表达式、主要的正则表达式,以及如何使用各种正则表达式处理引擎。

  • 什么是正则表达式
  • 正则表达式版本
  • 正则表达式的语法
  • 正则表达式语法的组成部分
  • 在Linux中使用正则表达式的16个示例
  • 正则表达式备忘单
  • 结论

什么是正则表达式

Linux中的正则表达式或regex是由特殊元字符组成的模式,用于匹配字符串或文本文件中的特定模式。

让我们通过一个现实生活中的例子来理解它,假设您想编写代码来查找一些特定的变量,然后在另一个代码文件中对它们进行操作,在这种情况下,您可能需要正则表达式。

正则表达式版本

正则表达式有不同的版本,重要的是要注意并非所有的正则表达式处理器命令都支持所有的正则表达式。

  • 基本正则表达式 (BRE)
  • 扩展正则表达式 (ERE)
  • Perl 兼容正则表达式 (PCRE)

BRE和ERE进一步分类为:

  • POSIX 基本正则表达式/扩展正则表达式
  • GNU BRE/ERE

POSIX BRE 和 POSIX ERE 是 GNU BRE 和 ERE 的子集,而 GNU BRE/ERE 是 PCRE 的子集。

正则表达式的语法

不同的命令行工具与正则表达式一起使用,例如:

  • grep
  • sed
  • awk

这些命令也被称为正则表达式引擎,它们帮助翻译复杂的正则表达式并给出输出。

使用grep的正则表达式语法

grep [options] 'pattern' [string/filename]

使用sed的正则表达式语法

sed [options] '/pattern/' [string/filename]

使用awk的正则表达式语法

awk [options] '/pattern/' [string/filename]

正则表达式语法的组成部分

正则表达式语法有六个主要组成部分:

  • 字符
  • 元字符
  • 量词
  • 角色类
  • 分组
  • 观察周围

字符:这些组件使用单个字符或多个字符形成模式,以在字符串或文件中搜索精确模式。例如,字符 H 将在文件中搜索 H,类似地,字母 Linux 将在文件中精确搜索 Linux 这个词。然而,可以使用 -i 标志使搜索对大小写不敏感。

元字符:这些组件包含特殊字符,并具有特定的功能。例如,点元字符用于查找字符,而 ^匹配行的开头,$ 匹配行的结尾。另一个元字符管道 a|b 用于在文件中匹配 a 和 b。

量词:这些组件用于查找特定模式必须重复多少次。例如,问号 ? 仅将前面的字符重复零次或一次,而星号 * 则找到前面的字符零次或多次。

字符类:方括号([])中包含的字符组被称为字符类组件。例如,[0-9]表示从0到9的数字,同样,[A-Z]表示所有的大写字母A到Z。

分组:此组件帮助将模式分组为圆括号()。它在查找重复序列(如电话号码或电子邮件地址)时尤其有用。

Lookarounds: 该组件用于在一个模式前或后与另一个模式相结合时进行正向和反向查找。例如,a(?=b) 将查找所有的a‘的,如果它们在b之前。

Linux 中使用正则表达式的 16 个示例

以下示例涵盖了各种元字符、量词、分组以及一些独特模式的用法。

示例 1:使用点(.)表达式

点是正则表达式的基本元字符,用于匹配单个字符。例如:

使用grep:

grep 'U.untu' mytextfile.txt

使用 sed:

sed -n '/U.untu/p' mytextfile.txt

使用 awk:

awk '/U.untu/' mytextfile.txt

示例2:使用插入符号(^)表达式

插入符号^元字符用于查找所有以给定模式开头的行。例如:

使用 grep:

grep '^K' mytextfile.txt

使用 sed:

sed -n '/^K/p' mytextfile.txt

使用 awk:

awk '/^K/' mytextfile.txt

上述命令从K开始打印文件中的所有条目。

示例3:使用美元($)表达式

这个元字符用于查找所有以特定字符结尾的字符串。例如:

使用 grep:

grep 'u$' mytextfile.txt

使用 sed:

sed -n '/u$/p' mytextfile.txt

使用 awk:

awk '/u$/' mytextfile.txt

上述命令给出了文件中所有以u结尾的字符串。

示例 4:使用星号(*)表达式

星号 * 量词匹配字符串中前一个字符的出现次数,可以是零次或多次。它等同于 {0,}。例如:

使用 grep:

grep 'tu*' mytextfile.txt

使用 sed:

sed -n '/tu*/p' mytextfile.txt

使用 awk:

awk '/tu*/' mytextfile.txt

示例5:使用问号 (?) 表达式

问号 (?) 量词用于搜索前面的字符是否出现零次或一次。它作为一个可选的修饰符。

使用 grep:

grep -E 'Ub?' mytextfile.txt

上面命令中的 -E 是用来表示扩展正则表达式的。

使用 sed:

sed -nE '/Ub?/p' mytextfile.txt

上面命令中的 -E 是用来表示扩展正则表达式的。

使用 awk:

awk '/Ub/' mytextfile.txt

下图中提到了星号和问号量词之间的区别。

星号搜索所有与前面的字符匹配的字符,而前面的字符的问号仅匹配一次。

示例 6:使用反斜杠 (\) 表达式

这个反斜杠\元字符用于表示特殊字符。例如,星号 * 本身是一个特殊字符,要字面使用星号,我们将使用反斜杠。

让我们在文件 mytextfile.txt 中找到所有名称中带有空格的 Linux 发行版。

使用 grep:

grep '\s' mytextfile.txt

使用 sed:

sed -n '/\s/p' mytextfile.txt

使用 awk:

awk '/\s/' mytextfile.txt

此外,反斜杠还与其他各种转义字符一起使用。

示例 7:使用圆括号() 创建模式组

圆括号()用于匹配其中的表达式组。让我们通过一个例子来理解它:

使用 grep:

grep -E '(untu)' mytextfile.txt

使用 sed:

sed -nE '/(untu)/p' mytextfile.txt

使用 awk:

awk '/(untu)/' mytextfile.txt

在上述命令中,引擎正在抓取与组(untu)匹配的条目。该组也可以与其后面的另一个模式一起使用。例如,如果我们将(untu)组替换为(unt)u,结果将是相同的。

示例 8:使用花括号 {} 表达式创建范围模式

大括号 {} 是重复量词。你可以用它们有三种不同的方式:

{x}: 出现x次

{x,y} 或者 {min,max}: 出现 x 次,但不超过 y 次

{x,}: 出现x次或更多

使用 grep:

grep -E l\{2} mytextfile.txt

使用 sed:

sed -nE '/l{2}/p' mytextfile.txt

使用 awk:

awk '/l{2}/' mytextfile.txt

上述命令查找包含字符l两次的条目,例如 Bill 和 Skill。

示例 9:使用 \d 查找数字

\d 表达式用于在字符串或文件中查找包含数字的字符串。例如:

使用 grep:

grep -P '\d' mytextfile.txt

P表示它是一个与Perl兼容的正则表达式,欲了解更多细节,请点击这里。

在 sed 和 awk 中,\d 不能使用,因为 sed 是 POSIX 正则表达式,而不是 Perl PCRE,因此,sed 和 awk 中等效于 \d 的是 [0-9] 或 [[:digit:]]。

使用 sed:

sed -n '/[0-9]/p' mytextfile.txt

或者:

sed -n '/[[:digit:]]/' mytextfile.txt

使用 awk:

awk '/[0-9]/' mytextfile.txt

或者:

awk -n '/[[:digit:]]/' mytextfile.txt

示例 10:使用逻辑或运算符 |

正则表达式的工作方式与逻辑或门的工作方式相同。例如,如果我们使用 a|o,那么这个模式将找到所有包含字母 a 或字母 o 的单词。

使用 grep:

grep -E 'k|a' mytextfile.txt

使用 sed:

sed -nE '/k|a/p' mytextfile.txt

使用 awk:

awk '/k|a/' mytextfile.txt

示例 11:寻找具有特定字符数的所有单词

要查找所有具有特定字符数的单词,我们可以使用点(.)。点元字符用于查找一个字符,但它也可以用于搜索多个字符。要查找所有四个字符的行,请使用:

使用 grep:

grep '^....$' mytextfile.txt

使用 sed:

sed -n '/^....$/p' mytextfile.txt

使用 awk:

awk '/^....$/' mytextfile.txt

示例 12:从文件中查找 IP 地址

IP地址是你想用正则表达式从文件中提取的关键项之一。由于IP地址包含点,使用正则表达式查找它并不是一项简单的操作:我们必须用斜杠转义点(.)。让我们从/etc/hosts文件中提取IP地址。

使用 grep:

grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' /etc/hosts

或者 :

grep -E '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}' /etc/hosts

使用 sed:

sed -nE '/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/p' /etc/hosts

使用 awk:

awk '/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/' /etc/hosts

示例 13:寻找小数

小数是由一个整数和一个在点(.)后面的分数部分组合而成的数字。要通过正则表达式从文件中获取小数,请参见下面给出的命令:

使用 grep:

grep -P '^\d*\.\d+$' mytextfile.txt

\d 相当于 [[:digit:]] 和 [0-9],但 grep 支持 PCRE 正则表达式,因此我们可以使用 -P 标志。

使用 sed:

sed -nE '/[[:digit:]]*\.[[:digit:]]+$/p' mytextfile.txt

使用 awk:

awk '/[0-9]*\.[0-9]+$/' mytextfile.txt

您可以在上述命令中将[[:digit:]]替换为[0-9]。

示例 14:以 HH:MM 12 小时格式查找时间

正则表达式还可以用来在文件中查找时间,让我们看看如何使用 grep、sed 和 awk 命令从文件中提取时间:

使用 grep:

grep -E '^(0?[1-9]|1[0-2]):[0-5][0-9]$' mytextfile.txt

使用 sed:

sed -nE '/^(0?[1-9]|1[0-2]):[0-5][0-9]$/p' mytextfile.txt

使用 awk:

awk '/^(0?[1-9]|1[0-2]):[0-5][0-9]$/' mytextfile.txt

示例 15:以YYYY-MM-DD格式查找日期

要从文件中提取时间,我们将使用以下正则表达式与 grep 一起使用:

使用 grep:

grep -P '([12]\d{3}:(0[1-9]|1[0-2]):(0[1-9]|[12]\d|3[01]))' mytextfile.txt

使用 sed:

sed -nE '/([12][[:digit:]]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][[:digit:]]|3[01]))/p' mytextfile.txt

使用 awk:

awk '/([12][[:digit:]]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][[:digit:]]|3[01]))/' mytextfile.txt

示例16:查找和替换模式

替换是另一种正则表达式方法,用于查找和替换模式。例如:

使用 sed:

语法:

sed -i 's/[pattern]/[replacement]/' [filename]

原始文本文件是:

执行命令:

sed -i 's/KaOS/Peepin/' mytextfile.txt

在上述命令中,-i 用于修改原始文件,如果没有这个标志,文件将只在终端中显示结果,而不修改文件。

检查文件以进行验证:

搜索可以通过在表达式末尾使用g来进一步增强;g将替换所有出现的情况。而不使用它时,只会替换第一个出现的情况。

使用 awk:

语法:

awk '{sub([pattern]/[replacement]); print}' [filename] > [new_filename]

执行命令:

awk '{sub(Peepin/,"KaOS"); print}' mytextfile.txt > newtextfile.txt

要验证,请检查新文件:

Peepin现在已经回到了KaOS的新文件中。

它也可以通过使用gsub来增强,而不是使用sub来替换模式的所有出现。

另一个需要考虑的重要事项是, awk 命令只会在终端显示输出,而不会修改原始文件。要保存结果,请使用重定向运算符并提供文件名。

正则表达式备忘单

正则表达式提供了许多元字符和量词,以创建复杂的模式,使搜索甚至更好。让我们列出常用的正则表达式规则。

正则表达式字符类

量词和选择

锚点

转义字符

组和观察

结论

正则表达式是用于创建模式的字符序列,帮助从文件中搜索某些信息并处理它。Linux中有各种正则表达式引擎,如grep、sed和awk。本指南涵盖了使用这三种Linux命令的基本到高级正则表达式。重要的是要注意并非所有Linux正则表达式引擎都支持所有种类的正则表达式,例如,sed和awk不支持PCRE,而所有引擎都支持BRE、ERE和PCRE。