号称“天书”的正则表达式,要这么来讲,我小学三年级已经满分了

引言grep是Linux中用于文件处理的最有用和最强大的命令之一 。
grep在一个或多个输入文件中搜索与正则表达式匹配的行 , 并将每个匹配的行写入标准输出 。
在本文中 , 我们将探索如何在grep的GNU版本中使用正则表达式的基础知识 , 该版本在大多数Linux操作系统中默认可用 。
号称“天书”的正则表达式,要这么来讲,我小学三年级已经满分了文章插图
grep的正则表达式正则表达式(regex)是与一组字符串匹配的模式 。 模式由操作符、构造文字字符和元字符组成 , 它们具有特殊的含义 。
GNU grep 支持三种正则表达式语法:Basic、Extended和Perl兼容 。
在其最简单的形式中 , 当没有给定正则表达式类型时 , grep将搜索模式解释为基本正则表达式 。
要将模式解释为扩展正则表达式 , 请使用-E(或--tended-regexp)选项 。
在GNU的grep实现中 , 基本正则表达式语法和扩展正则表达式语法之间没有功能差异 。 唯一的区别是 , 在基本正则表达式中 , 元字符?、+、{、|、(和)被解释为文字字符 。
要在使用基本正则表达式时保留元字符的特殊含义 , 必须使用反斜杠(\)对字符进行转义 。 我们稍后将解释这些元字符和其他元字符的含义 。
通常 , 你应该始终用单引号将正则表达式括起来 , 以避免shell解释和扩展元字符 。
文本匹配grep命令最基本的用法是在文件中搜索文字字符或字符序列 。
例如 , 要显示/etc/passwd文件中包含字符串“bash”的所有行 , 你可以运行以下命令:
grep bash /etc/passwd输出内容如下:
root:x:0:0:root:/root:/bin/bashcoder:x:1000:1000:coder:/home/coder:/bin/bash在本例中 , 字符串“bash”是一个基本的正则表达式 , 由四个文字字符组成 。 这告诉grep搜索“b”紧跟“a”、“s”和“h”的字符串 。
默认情况下 , grep命令区分大小写 。 这意味着大写和小写字符被视为不同字符 。 要在搜索时忽略大小写 , 请使用-i选项(或--Ignore-case) 。
需要注意的是 , grep将搜索模式作为字符串而不是单词进行查找 。 因此 , 如果你要搜索“gnu” , grep还会打印“gnu”嵌入较大单词的行 , 例如“cygnus”或“magum” 。
如果搜索字符串包含空格 , 则需要用单引号或双引号将其引起来:
grep "FTP User" /etc/passwd锚点锚点是元字符 , 允许您指定必须在行中的什么位置找到匹配项 。 ^(脱字符)与行首的空字符串匹配 。
在下面的示例中 , 字符串“linux”只有在行首出现时才会匹配 。
grep '^linux' file.txt$(dollar)符号与行首的空字符串匹配 。 要查找以字符串“linux”结尾的行 , 你可以使用:
grep 'linux$' file.txt你还可以使用这两个锚点构造正则表达式 。 例如 , 要查找仅包含“linux”的行 , 请运行:
grep '^linux$' file.txt如果用拍匹配空白行 , 可以使用“^$”模式 。
匹配单个字符那个.(英文句号)符号是匹配任何单个字符的元字符 。
例如 , 要匹配以“kan”开头、然后有两个字符、以字符串“roo”结尾的任何内容 , 可以使用以下模式:
grep 'kan..roo' file.txt这样可以匹配出含有 kangaroo 的行 。
方括号表达式方括号表达式允许通过将一组字符括在方括号[]中来匹配它们 。 例如 , 查找包含“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.txtgrep还支持用括号括起来的预定义字符类 。 下表显示了一些最常见的字符类:

  • [:alnum:] 字母数字字符 。
  • [:alpha:] 字母字符 。
  • [:blank:] 空格和制表符 。
  • [:digit:] 数字 。
  • [:lower:] 小写字母 。
  • [:upper:] 大写字母 。
完全的量词表可参考 man grep 手册 。
量词量词允许你指定匹配必须出现的项的出现次数 。 下表显示了GNU grep支持的限定符: