grep与egrep命令及正则表达式

前端之家收集整理的这篇文章主要介绍了grep与egrep命令及正则表达式前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

在Linux中,有很多文本处理的方式,今天我们就来介绍其中的一种grep系。

grep系相对来说也是功能很强大的文本处理工具,俗称文本三剑客之一(其余两个为sed、awk)。

grep系可分为grep、egrep、fgrep(默认情况下不开启正则表达式)。

grep系的功能:利用正则表达式全局搜索,并将匹配的都显示出来

grep的用法格式: grep [options] PATTERN [FILE...]

其中PATTERN为要匹配的字符

先举个简单例子:[root@localhost ~]# grep -c root /etc/passwd

运行时就会在/etc/passwd目录下找出含有root的文件

其中root就是PATTERN

下面我们就重点来谈谈正则表达式。

正则表达式:

元字符:会被正则表达式引擎解释为特殊含义;

基本的正则表达式:BRE(grep默认使用)

扩展的正则表达式:ERE(egrep默认使用)

其中:

grep默认仅支持基本正则表达式;

egrep默认仅支持扩展正则表达式;

fgrep默认不开启正则表达式引擎;

文本字符:只具备字符表面含义的那些字符

grep系的选项有很多,下面列举一些比较常用的选项:

-i,--ignore-case

忽略模式 PATTERN 和输入文件中的大小写的分别。

-v,--invert-match

改变匹配的意义,只选择不匹配的行。反向匹配


-c,--count

禁止通常的输出;作为替代,为每一个输入文件打印一个匹配的行的总数。

-o,--only-matching

显示匹配的行中与 PATTERN 相匹配的部分。关闭贪婪模式。


-q,--quiet,--silent

安静。不向标准输出写任何东西。如果找到任何匹配的内容就立即以状态值

0 退出,即使检测到了错误。 参见 -s 或 --no-messages 选项。


--colour[=WHEN],--color[=WHEN]

在匹配的行周围以 GREP_COLOR 环境变量中指定的记号来标记。WHEN

可以是 `never',`always',或是 `auto'。


-E,--extended-regexp(相当于egrep)

将模式 PATTERN 作为一个扩展的正则表达式来解释 (参见下面)。

-F,--fixed-strings(相当于fgrep)

将模式 PATTERN 视为一个固定的字符串的列表,用新行 (newlines)

分隔,只要匹配其中之一即可。

-G,--basic-regexp(相当于grep)

将模式 PATTERN 作为一个基本的正则表达式 (参见下面)

来解释。这是默认值。


-P,--perl-regexp

将模式 PATTERN 作为一个 Perl 正则表达式来解释。

-A NUM,--after-context=NUM

打印出紧随匹配的行之后的下文NUM行。在相邻的匹配组之间将会打印内容是 -- 的一行。

-B NUM,--before-context=NUM

打印出匹配的行之前的上文NUM行。在相邻的匹配组之间将会打印内容是 -- 的一行。

-C NUM,--context=NUM

打印出匹配的行的上下文前后各NUM行。在相邻的匹配组之间将会打印内容是 -- 的一行。

PATTERN:正则表达式字符:

基本的正则表达式字符:

globbing(简化版的正则表达式)


字符匹配:

.:匹配任意单个字符

所有的字符集都可以放到中括号中表示单个字符

[]:匹配指定位置的单个字符

[^]:匹配指定位置以外的单个字符

[:xdigit:]:所有的十六进制

a-z:所有的小写字母

A-Z:所有的大写字母

0-9:所有的十进制数字


次数匹配:表示该类字符之前的那个字符可以出现任意次

*:其前面的字符可以出现零壹或多次(使用较多)

\?:其前面的字符可有可无

\+:其前面的字符至少出现一次

\{m\}:其前面的字符必须出现m次

\{m,n\}:其前面的字符至少出现m次,至多出现n次

\{,n\}:其前面的字符至多出现n次

\{m,\}:其前面的字符至少出现m次


.*:任意长度的任意字符


位置锚定字符:

行锚定:

行首锚定:^

行尾锚定:$

字锚定:

字首锚定:\< 或 (\b老方法,一般不用了)

字尾锚定:\> 或 \b


注意:对于正则表达式引擎来说,字是由非特殊字符组成的连续字符串;



分组与引用字符:

\(PATTERN\):PATTERN当作整体字串来处理,不分开

例:\(yxz\):其中把yxz当作一个整体来进行搜素

在正则表达式引擎中,有一系列的内置变量,这些变量会保存至所有分组内的字符信息。用于后向引用,这些变量依次是:\1,\2,\3,

\1:第一组小括号中的PATTERN匹配到的字符

\2:第2组小括号中的PATTERN匹配到的字符


例:找uid与gid相同的用户

[root@localhost ~]# grep '\(\<[[:digit:]]\+\>\).*\1' /etc/passwd

用户名与bash相同

[root@localhost ~]# grep '\(\<[[:alpha:]]\+\>\).*\1$' /etc/passwd


或:\|(多选一)

注意:\|将其左右两边的字符串当作整体对待;

例子: [root@localhost ~]# grep -c '^[[:space:]]*$' 2

ifconfig | grep '\<1[0-9][0-9]\>'

ifconfig | grep '\<255\>$'


grep [options] [-e PATTERN | -f FILE] [FILE...] [FILE...] (例:/etc/* )


默认情况下,grep只有一个PATTERN,如果想要写多个PATTERN的话,要使用-e 选项

将所需要的PATTERN写入到一个文件中,保证每行只有一个PATTERN,此时我们可以使用-f file方式



egrep:默认仅支持扩展正则表达式

grep [options] PATTERN [FILE...]

扩展的正则表达式元字符与grep差不多

但其“或”符号为: |


fgrep:PATTERN所有的字符都被当作文本字符来处理

猜你在找的正则表达式相关文章