Grep(Regex)中的正则表达式

grep 是Linux中用于文本处理的最有用和功能最强大的命令之一。 grep 在一个或多个输入文件中搜索与正则表达式匹配的行,并将每个匹配的行写入标准输出。

在本文中,我们将探讨如何在GNU版本的正则表达式中使用正则表达式的基础知识。 grep,大多数Linux操作系统默认情况下可用。

Grep正则表达式#

正则表达式或正则表达式是与一组字符串匹配的模式。 模式由运算符,构造文字字符和元字符组成,它们具有特殊的含义。 GNU grep 支持三种正则表达式语法,Basic,Extended和Perl兼容。

最简单的形式是,如果没有给出正则表达式类型, grep 将搜索模式解释为基本正则表达式。 要将模式解释为扩展的正则表达式,请使用 -E ( 要么 --extended-regexp) 选项。

在GNU的实现中 grep 基本和扩展正则表达式语法之间在功能上没有区别。 唯一的区别是,在基本正则表达式中,元字符 ?+{|() 被解释为文字字符。 为了在使用基本正则表达式时保留元字符的特殊含义,必须使用反斜杠对字符进行转义()。 稍后我们将解释这些和其他元字符的含义。

通常,您应始终将正则表达式括在单引号中,以避免shell解释和扩展元字符。

文字匹配

最基本的用法 grep 命令是在文件中搜索文字字符或一系列字符。 例如,要显示所有包含字符串“ bash”的行, /etc/passwd 文件,您将运行以下命令:

grep bash /etc/passwd

输出应如下所示:

root:x:0:0:root:/root:/bin/bash
linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

在此示例中,字符串“ bash”是由四个文字字符组成的基本正则表达式。 这说明 grep 搜索具有紧随其后的“ a”,“ s”和“ h”的字符串“ b”的字符串。

默认情况下, grep 命令区分大小写。 这意味着将大写和小写字符视为不同的字符。

要在搜索时忽略大小写,请使用 -i 选项(或 --ignore-case)。

重要的是要注意 grep 查找搜索模式为字符串,而不是单词。 因此,如果您要搜索“ gnu”, grep 还将打印以较大单词(例如“天鹅座”或“大酒瓶”)嵌入“ gnu”的行。

如果搜索字符串包含空格,则需要将其用单引号或双引号引起来:

grep "Gnome Display Manager" /etc/passwd

锚定#

定位符是元字符,可让您指定必须在该行中找到匹配项的位置。

^ (脱字符号)符号与一行开头的空字符串匹配。 在以下示例中,仅当字符串“ linux”出现在行的开头时才匹配。

grep '^linux' file.txt

$ (美元)符号与行首的空字符串匹配。 要找到以字符串“ linux”结尾的行,可以使用:

grep 'linux$' file.txt

您还可以使用两个锚点构造一个正则表达式。 例如,要查找仅包含“ linux”的行,请运行:

grep '^linux$' file.txt

另一个有用的例子是 ^$ 匹配所有空行的模式。

匹配单个字符

. (句点)符号是与任何单个字符匹配的元字符。 例如,要匹配以“ kan”开头,然后有两个字符并以字符串“ roo”结尾的任何内容,则可以使用以下模式:

grep 'kan..roo' file.txt

括号表达式

括号表达式允许将一组字符括在括号中来匹配一组字符 []。 例如,找到包含“ accept”或“ accent”的行,可以使用以下表达式:

grep 'acce[np]t' file.txt

如果方括号内的第一个字符是插入号 ^,则它匹配括号内未包含的任何单个字符。 以下模式将匹配以“ co”开头,除“ l”之后为“ la”之外的任何字母(例如“ coca”,“ cobalt”等)开头的任何字符串组合,但不匹配包含“ cola”的行”:

grep 'co[^l]a' file.txt

您可以在方括号内指定一系列字符,而不是一个一个地放置字符。 通过指定以连字符分隔的范围的第一个和最后一个字符来构造范围表达式。 例如, [a-a] 相当于 [abcde][1-3] 相当于 [123]

以下表达式匹配以大写字母开头的每一行:

grep '^[A-Z]' file.txt

grep 还支持括号中预定义的字符类。 下表显示了一些最常见的字符类:

QuantifierCharacter类[:alnum:]字母数字字符。[:alpha:]字母字符。[:blank:]空格和制表符。[:digit:]数字。[:lower:]小写字母。[:upper:]大写字母。

有关所有字符类的完整列表,请参阅Grep手册。

量词

量词允许您指定要出现的匹配项必须出现的项数。 下表显示了GNU支持的量词 grep

量词说明*匹配上一项零次或多次。?匹配上一项零或一次。+将上一项匹配一次或多次。{n}与上一项完全匹配 n 次。{n,}至少匹配上一项 n 次。{,m}最多匹配上一项 m 次。{n,m}匹配来自的前一项 nm 次。

* (星号)字符与前面的项目匹配零次或多次。 以下将匹配“正确”,“正确”,“正确”等等。

grep 's*right'

下面是更高级的模式,它匹配所有以大写字母开头,以句点或逗号结尾的行。 的 .* 正则表达式匹配任意数量的任何字符:

grep -E '^[A-Z].*[.,]$' file.txt

? (问号)字符使前一项为可选,并且只能匹配一次。 以下内容将同时匹配“亮”和“右”。 的 ? 字符以反斜杠转义,因为我们使用的是基本正则表达式:

grep 'b?right' file.txt

这是使用扩展正则表达式的正则表达式:

grep -E 'b?right' file.txt

+ (加号)字符与上一项匹配一次或多次。 以下将匹配“正确”和“正确”,但不匹配“正确”:

grep -E 's+right' file.txt

大括号字符 {} 允许您指定确切的数字,上限或下限或匹配发生必须发生的发生范围。

以下内容匹配3到9位之间的所有整数:

grep -E '[[:digit:]]{3,9}' file.txt

交替编号

术语交替是简单的“或”。 交替运算符 | (管道)可让您指定不同的可能匹配项,这些匹配项可以是文字字符串或表达式集。 在所有正则表达式运算符中,此运算符的优先级最低。

在下面的示例中,我们正在搜索所有出现的单词 fatalerrorcritical 在Nginx日志错误文件中:

grep 'fatal|error|critical' /var/log/nginx/error.log

如果使用扩展的正则表达式,则运算符 | 不应逃脱,如下所示:

grep -E 'fatal|error|critical' /var/log/nginx/error.log

分组编号

分组是正则表达式的一项功能,可让您将模式分组在一起并将其作为一项引用。 使用括号创建组 ()

使用基本的正则表达式时,括号必须以反斜杠()。

下面的示例同时匹配“ fearless”和“ less”。 的 ? 量词使 (fear) 组可选:

grep -E '(fear)?less' file.txt

特殊反斜杠表达式

GNU grep 包含几个由反斜杠和常规字符组成的元字符。 下表显示了一些最常见的特殊反斜杠表达式:

表达说明b匹配单词边界。<在单词开头匹配一个空字符串。>在单词末尾匹配一个空字符串。w匹配一个单词。s匹配一个空格。

以下模式将匹配单独的单词“ abject”和“ object”。 如果嵌入较大的单词,它将不匹配单词:

grep 'b[ao]bjectb' file.txt

结论#

正则表达式用于文本编辑器,编程语言和命令行工具,例如 grepsedawk 。 在搜索文本文件,编写脚本或过滤命令输出时,了解如何构造正则表达式将非常有帮助。

如果您有任何疑问或反馈,请随时发表评论。

grep终端

Sidebar