0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux中的Grep正则表达式详细资料说明

Wildesbeast 来源:Linux公社 作者:醉落红尘 2020-06-21 11:39 次阅读

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

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

Grep正则表达式

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

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

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

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

文字匹配

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

[linuxidc@localhost www.linuxidc.com]$ grep bash /etc/passwd

输出应如下所示:

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

linuxidc:x:1000:1000:linuxidc:/home/linuxidc:/bin/bash

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

缺省情况下,grep命令区分大小写。 这意味着将大写和小写字符视为不同的字符。 要在搜索时忽略大小写,请使用-i选项(或--ignore-case)。

请务必注意,grep会将搜索模式作为字符串而不是单词来查找。 因此,如果您要搜索“ gnu”,则grep还将打印“ gnu”嵌入较大字词(例如“ cygnus”或“ magnum”)的行。

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

$grep “Gnome Display Manager” /etc/passwd

锚定Anchoring

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

^(脱字符号)符号与一行开头的空字符串匹配。 在以下示例中,仅当字符串“ 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 Classes

[:alnum:]字母数字字符。

[:alpha:]字母字符。

[:blank:]空格和制表符。

[:digit:]数字。

[:lower:]小写字母。

[:upper:]大写字母。

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

量词

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

Quantifier描述

*匹配上一项零次或多次。

?匹配上一项零或一次。

+将上一项匹配一次或多次。

{n}将前一项精确匹配n次。

{n,}至少匹配n个项目。

{,m}最多匹配m次以上项。

{n,m}将前一项匹配n至m次。

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

$grep ‘s*right’

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

$grep -E ‘^[A-Z].*[。,]$’ file.txt

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

$grep ‘b?right’ file.txt

下面是使用扩展正则表达式的同一个正则表达式:

$grep -E ‘b?right’ file.txt

+(加号)字符与前面的项目匹配一次或多次。 以下将匹配“sright”和“ssright”,但不匹配“right”:

$grep -E ‘s+right’ file.txt

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

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

$grep -E ‘[[:digit:]]{3,9}’ file.txt

交替Alternation

交替是一个简单的“或”。替换操作符| (pipe)允许您指定不同的可能匹配,可以是文字字符串或表达式集。该操作符在所有正则表达式操作符中优先级最低。

在下面的例子中,我们搜索Nginx日志错误文件中出现的所有单词fatal, error和critical:

$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包含几个元字符,由反斜杠和常规字符组成。 下表显示了一些最常见的特殊反斜杠表达式:

ExpressionDescription

单词锁定符

《在单词开头匹配一个空字符串。

》在单词末尾匹配一个空字符串。

w匹配一个单词。

s匹配一个空格。

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

$grep ‘[ao]bject’ file.txt

总结

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10990

    浏览量

    206738
  • GNU
    GNU
    +关注

    关注

    0

    文章

    141

    浏览量

    17333
收藏 人收藏

    评论

    相关推荐

    你还不会gvim正则表达式?一文搞懂!

    gvim正则表达式常在命令行模式下使用,一般用于文本文件字符串的替换、删除等操作。
    的头像 发表于 01-19 16:47 317次阅读

    GVIM正则表达式介绍和使用示例

    的Ken Thompson借用这个概念并将它应用到了文本编辑器中。后面正则表达式的说法进入到了大家常用的vi、vim、gvim当中。
    的头像 发表于 12-18 15:09 387次阅读
    GVIM<b class='flag-5'>正则表达式</b>介绍和使用示例

    linux正则表达式匹配字符串

    是非常重要的。本文将详细介绍Linux正则表达式的基本语法和常见用法,帮助读者深入了解并灵活运用正则表达式。 第一部分:正则表达式的基本语法
    的头像 发表于 11-23 10:26 336次阅读

    什么是正则表达式正则表达式如何工作?哪些语法规则适用正则表达式

    正则表达式又称规则表达式(Regular Expression,在代码中常简写为 regex、regexp 或 RE),是一种用于匹配、查找、替换文本的强大工具。它能够以特定的模式匹配字符串,从而
    的头像 发表于 11-03 14:41 568次阅读
    什么是<b class='flag-5'>正则表达式</b>?<b class='flag-5'>正则表达式</b>如何工作?哪些语法规则适用<b class='flag-5'>正则表达式</b>?

    Java Lambda表达式的新特性

    Java Lambda表达式是Java 8中最重要的新特性之一。 它们是一种可传递的匿名函数,可以作为参数传递给方法或存储在变量中,因此可以在需要的时候调用它们。 基础 1. 简介 Lambda
    的头像 发表于 09-30 10:29 2290次阅读

    怎么去选择使用gm的三种表达式呢?

    我们在写跨导gm的表达式时,知道gm有三种表达式表达式含有的变量其实只有三个,一个W/L,一个Vgs-Vth,还有一个Id。
    的头像 发表于 09-17 15:31 3101次阅读
    怎么去选择使用gm的三种<b class='flag-5'>表达式</b>呢?

    zabbix触发器表达式 基本RS触发器表达式 rs触发器的逻辑表达式

    zabbix触发器表达式 基本RS触发器表达式 rs触发器的逻辑表达式  Zabbix是一款开源的监控软件,它能通过监控指标来实时监测服务器和网络的运行状态,同时还能提供警报和报告等功能来帮助管理员
    的头像 发表于 08-24 15:50 1215次阅读

    如何使用lambda表达式提升开发效率?

    Java8 的一个大亮点是引入 Lambda 表达式,使用它设计的代码会更加简洁。当开发者在编写 Lambda 表达式时,也会随之被编译成一个函数式接口。
    发表于 08-24 10:25 172次阅读

    egrep和grep两个常用的命令区别在哪?

    egrep 和 grep 是两个常用的命令行工具,用于在文本文件中搜索匹配某个模式的行。它们的主要区别在于正则表达式的语法支持。
    的头像 发表于 07-08 10:01 5816次阅读

    Python中的正则表达式

    哈喽大家好,我是了不起,今天给大家讲Python中的正则表达式 在Python中,正则表达式是一种强大的文本处理工具,它可以用来匹配、搜索、替换文本。正则表达式是一个特殊的字符序列,它可以描述一类
    的头像 发表于 06-21 16:52 713次阅读

    OpenHarmony中使用正则表达式

    本文主要介绍笔者在做开源鸿蒙应用开发时,ArkTs 中使用正则表达式处理像 string 等字符串对象。
    的头像 发表于 06-06 09:24 659次阅读

    一文详解Verilog表达式

    表达式由操作符和操作数构成,其目的是根据操作符的意义得到一个计算结果。表达式可以在出现数值的任何地方使用。
    的头像 发表于 05-29 16:23 1939次阅读
    一文详解Verilog<b class='flag-5'>表达式</b>

    shell脚本基础:正则表达式grep

    Linux上有许多命令可以使用正则表达式,其中最常见的是grep命令和sed命令。正则表达式有多种类型,每种类型中可以使用的元字符类型不同。最常见的是基本
    的头像 发表于 05-29 09:29 777次阅读
    shell脚本基础:<b class='flag-5'>正则表达式</b><b class='flag-5'>grep</b>

    KiCad 7添加网络类(一):通配符与正则表达式

    的网络没有“通用”特征,那该怎么办呢?要么去修改原理图中网络的名称,要么就只能用土办法,挨个添加。如下图,因为没法批量匹配,只能一行行的网络添加到网络类。 灵活使用正则表达式,对于需要使用网络类
    发表于 05-24 14:41

    Linux入门之正则表达式

    一些约定好的匹配规则,但由于规则较多,可能比较容易忘记。 本文会先整理出所有的正则表达式以及其含义,接下来会利用grep命令,详细介绍每种正则表达式的使用方式,并给出案例。
    的头像 发表于 05-12 15:31 567次阅读
    <b class='flag-5'>Linux</b>入门之<b class='flag-5'>正则表达式</b>