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 ]$ 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手册。
量词