grep是Linux中用于文本处理的最有用和最强悍的命令之一。grep在一个或多个输入文件中搜索与正则表达式匹配的行并将每位匹配的行写入标准输出。
在本文中,我们将阐述怎样在GNU版本中使用正则表达式的基础知识,该版本grep在大多数Linux操作系统中默认可用。
Grep正则表达式
正则表达式或正则表达式是匹配一组字符串的模式。模式由运算符、构造文字字符和具有特殊涵义的元字符组成。GNUgrep支持三种正则表达式句型,Basic、Extended和Perl-compatible。
在最简单的方式中,当没有给出正则表达式类型时,grep将搜索模式解释为基本的正则表达式。要将模式解释为扩充正则表达式,请使用-E(或--extended-regexp)选项。
在GNU的实现中grep,基本正则表达式句型和扩充正则表达式句型之间没有功能差别。惟一的区别是在基本正则表达式中,元字符?,+,{,|,(,和)被解释为文字字符。为了在使用基本正则表达式时保持元字符的特殊涵义,必须使用反斜杠()对字符进行通配符。稍后我们将解释这种和其他元字符的含意。
一般,您应当仍然将正则表达式括在单冒号中,以防止shell对元字符进行解释和扩充。
字面匹配
该grep命令最基本的用法是在文件中搜索一个文字字符或一系列字符。诸如,要显示/etc/passwd文件中包含字符串“bash”的所有行linux shell grep 正则,您可以运行以下命令:
grep bash /etc/passwd
输出应如下所示:
root:x:0:0:root:/root:/bin/bash
linuxtest:x:1000:1000:linuxtest:/home/linuxize:/bin/bash
在这个反例中,字符串“bash”是一个基本的正则表达式,由四个文字字符组成。这告诉grep搜索具有“b”紧跟“a”、“s”和“h”的字符串。
默认情况下,该grep命令分辨大小写。这意味着小写和大写字符被视为不同的。
要在搜索时忽视大小写,请使用-i选项(或--ignore-case)。
请勿必注意,grep将搜索模式作为字符串而不是词组进行查找。因而,倘若您正在搜索“gnu”红旗linux5.0,grep也会复印“gnu”嵌入较大词组的行,比如“cygnus”或“magnum”。
假如搜索字符串包含空格,则须要将其括在单冒号或双冒号中:
grep "Gnome Display Manager" /etc/passwd
锚定
锚点是元字符,容许您指定必须在行中的那个位置找到匹配项。
该^(尖)符号在一行的开头空字符串相匹配。在以下示例中,字符串“linux”仅在出现在行首时就会匹配。
grep '^linux' file.txt
该$(欧元)符号在一行的开头空字符串相匹配。要查找以字符串“linux”结尾的行,您可以使用:
grep 'linux#39; file.txt
您还可以使用两个锚点建立正则表达式。比如,要查找仅包含“linux”的行,请运行:
grep '^linux#39; file.txt
另一个有用的事例是^$匹配所有空行的模式。
匹配单个字符
的.(周期)符号是元字符匹配任何单个字符。比如,要匹配以“kan”开头之后有两个字符并以字符串“roo”结尾的任何内容,您可以使用以下模式:
grep 'kan..roo' file.txt
括弧表达式
括弧表达式容许通过将一组字符括在括弧中来匹配一组字符[]。诸如linux shell grep 正则,查找包含“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还支持括在括弧中的预定义字符类。下表显示了一些最常见的字符类:
量词
字符类
[:alnum:]
字母数字字符。
[:alpha:]
字母字符。
[:blank:]
空格和制表符。
[:digit:]
数字。
[:lower:]
大写字母。
[:upper:]
小写字母。
有关所有字符类的完整列表,请查看Grep指南。
量词
量词容许您指定匹配发生时必须出现的项目的出现次数。下表显示了GNU支持的量词grep:
量词
描述
匹配上面的项目零次或多次。
匹配前一项零次或一次。
匹配前一项或多次。
{n}
精确匹配上面的项目n。
{n,}
起码匹配前一项n。
{,m}
大多数m时侯匹配上面的项目。
{n,m}
从ntom次匹配上面的项目。
的*(星号)的字符前述项零次或多次匹配。以下将匹配“right”、“sright”、“ssright”等:
grep 's*right'
下边是更中级的模式linux获取当前时间,它匹配所有以小写字母开头并以句点或冒号结尾的行。在.*正则表达式匹配任何数目的任何字符:
grep -E '^[A-Z].*[.,]#39; 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
交替
术语交替是一个简单的“或”。交替运算符|(管线)准许您指定不同的可能匹配项,这种匹配项可以是文字字符串或表达式集。此运算符在所有正则表达式运算符中的优先级最低。
在下边的反例中,我们正在找寻的词组的所有风波fatal,error以及critical在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
特殊反斜杠表达式
GNUgrep包含几个元字符,由反斜杠后跟一个常规字符组成。下表显示了一些最常见的特殊反斜杠表达式:
抒发
描述
b
匹配词组边界。
匹配词组末尾的空字符串。
w
匹配一个词。
s
匹配一个空格。
以下模式将匹配单独的词组“abject”和“object”。假如嵌入较大的词组,它将不匹配词组:
grep 'b[ao]bjectb' file.txt
推论
正则表达式在文本编辑器,编程语言,以及例如命令行工具使用grep,sed和awk。在搜索文本文件、编写脚本或过滤命令输出时,了解怎样建立正则表达式特别有用。
文章评论