Linux中grep、egrep正则表达式的使用

正则表达式的由来

正则表达式,英文写法Regular Expression,在编程语言中常被简写为regex、regexp等。它是用来描述、匹配一系列符合某个句法规则字符串的单个字符串。

正则表达式通常被用来检索、替换那些符合某个模式(Pattern)的文本。

1950年代,UNIX之父Ken Thompson将正则表达式引入编辑器QED,然后是编辑器ed,最终引入到grep中。从此,正则表达式被广泛地应用到了各种UNIX或类UNIX系统的工具之中,例如perl。

近些年来,主流操作系统、主流开发语言都能看到正则表达式的身影,掌握正则表达式并熟练应用,成为系统维护人员、程序开发人员必备技能。

grep、egrep简介

Linux使用了GNU版本的grep、egrep程序。

grep,全称 global search regular expression and print out the line,全面搜索正则表达式并把行打印出来。

grep能够借助正则表达式搜索文本,并把匹配行或者匹配项打印出来,同时它还可以使用-E选项使用egrep功能,使用-P使用perl正则表达式功能。

序号 名称 英文名称 缩写
1 基本正则表达式 Basic Regular Expression BRE
2 扩展正则表达式 Extended Regular Expression ERE
3 Perl正则表达式 Perl Regular Expression PRE

grep、egrep语法

grep和egrep都是对文本文件,按照给定的模式(PATTERN)逐行搜索。

1、 grep

grep [OPTION]... PATTERN [FILE]...

默认使用 基本正则表达式

使用 –E 选项,使用 扩展正则表达式

使用 –P 选项,使用 Perl正则表达式

2、 egrep

egrep [OPTION]... PATTERN [FILE]...

默认使用 扩展正则表达式

使用 –P 选项,使用Perl正则表达式

grep使用举例

例1:取出本机的IP地址

1、ifconfig | grep -o "inet addr:[^[:space:]]\+" | cut -d: –f2

2、ifconfig | grep -o -E "inet addr:[^[:space:]]+" | cut -d: –f2

3、ifconfig | egrep -o "inet addr:[^[:space:]]+" | cut -d: –f2

例2:取出函数名

1、grep  -o "\<[[:alnum:]]\+\>()" /etc/rc.d/init.d/functions

2、egrep -o "\<[[:alnum:]]+\>\(\)" /etc/rc.d/init.d/functions

例3:建立一个文本文件,内容如下

He like his lover.    
He love his lover.    
He like his liker.    
He love his liker.

找出最后一个单词是前面单词+r构成的行。

# cat > 1.txt <<EOF    
> He like his lover.    
> He love his lover.    
> He like his liker.    
> He love his liker.    
> EOF

1、egrep "(\<[[:alnum:]]+\>).*\1r" 1.txt

2、grep "\(\<[[:alnum:]]\+\>\).*\1r" 1.txt

3、grep "\(\<[[:alnum:]]\{1,\}\>\).*\1r" 1.txt

正则表达式元字符对照表

字符 说明 Basic RegEx Extended RegEx python RegEx Perl regEx
转义   \ \ \ \
^ 匹配行首,例如‘^dog‘匹配以字符串dog开头的行(注意:awk 指令中,‘^‘则是匹配字符串的开始) ^ ^ ^ ^
$ 匹配行尾,例如:‘^、dog$‘匹配以字符串 dog 为结尾的行(注意:awk 指令中,‘$‘则是匹配字符串的结尾) $ $ $ $
^$ 匹配空行 ^$ ^$ ^$ ^$
^string$ 匹配行,例如:‘^dog$‘匹配只含一个字符串 dog 的行 ^string$ ^string$ ^string$ ^string$
\< 匹配单词,例如:‘\<frog‘ (等价于‘\bfrog‘),匹配以 frog 开头的单词 \< \< 不支持 不支持(但可以使用\b来匹配单词,例如:‘\bfrog‘)
\> 匹配单词,例如:‘frog\>‘(等价于‘frog\b ‘),匹配以 frog 结尾的单词 \> \> 不支持 不支持(但可以使用\b来匹配单词,例如:‘frog\b‘)
\<x\> 匹配一个单词或者一个特定字符,例如:‘\<frog\>‘(等价于‘\bfrog\b‘)、‘\<G\>‘ \<x\> \<x\> 不支持 不支持(但可以使用\b来匹配单词,例如:‘\bfrog\b‘
() 匹配表达式,例如:不支持‘(frog)‘ 不支持(但可以使用\(\),如:\(dog\) () () ()
\(\) 匹配表达式,例如:不支持‘(frog)‘ \(\) 不支持(同()) 不支持(同()) 不支持(同())
匹配前面的子表达式 0 次或 1 次(等价于{0,1}),例如:where(is)?能匹配"where" 以及"whereis" 不支持(同\?)
\? 匹配前面的子表达式 0 次或 1 次(等价于‘\{0,1\}‘),例如:‘where\(is\)\? ‘能匹配 "where"以及"whereis" \? 不支持(同?) 不支持(同?) 不支持(同?)
? 当该字符紧跟在任何一个其他限制符(*, +, ?, {n},{n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",‘o+?‘ 将匹配单个"o",而 ‘o+‘ 将匹配所有 ‘o‘ 不支持 不支持 不支持 不支持
. 匹配除换行符(‘\n‘)之外的任意单个字符(注意:awk 指令中的句点能匹配换行符) . .(如果要匹配包括“\n”在内的任何一个字符,请使用:‘(^$)|(.) . .(如果要匹配包括“\n”在内的任何一个字符,请使用:‘ [.\n] ‘
* 匹配前面的子表达式 0 次或多次(等价于{0, }),例如:zo* 能匹配 "z"以及 "zoo" * * * *
\+ 匹配前面的子表达式 1 次或多次(等价于‘\{1, \}‘),例如:‘where\(is\)\+ ‘能匹配 "whereis"以及"whereisis" \+ 不支持(同+) 不支持(同+) 不支持(同+)
+ 匹配前面的子表达式 1 次或多次(等价于{1, }),例如:zo+能匹配 "zo"以及 "zoo",但不能匹配 "z" 不支持(同\+) + + +
{n} n 必须是一个 0 或者正整数,匹配子表达式 n 次,例如:zo{2}能匹配 不支持(同\{n\}) {n} {n} {n}
{n,} "zooz",但不能匹配 "Bob"n 必须是一个 0 或者正整数,匹配子表达式大于等于 n次,例如:go{2,} 不支持(同\{n,\}) {n,} {n,} {n,}
{n,m} 能匹配 "good",但不能匹配 godm 和 n 均为非负整数,其中 n <= m,最少匹配 n 次且最多匹配 m 次 ,例如:o{1,3}将配"fooooood" 中的前三个 o(请注意在逗号和两个数之间不能有空格) 不支持(同\{n,m\}) {n,m} {n,m} {n,m}
x|y 匹配 x 或 y,例如: 不支持‘z|(food)‘ 能匹配 "z" 或"food";‘(z|f)ood‘ 则匹配"zood" 或 "food" 不支持(同x\|y) x|y x|y x|y
[0-9] 匹配从 0 到 9 中的任意一个数字字符(注意:要写成递增) [0-9] [0-9] [0-9] [0-9]
[xyz] 字符集合,匹配所包含的任意一个字符,例如:‘[abc]‘可以匹配"lay" 中的 ‘a‘(注意:如果元字符,例如:. *等,它们被放在[ ]中,那么它们将变成一个普通字符) [xyz] [xyz] [xyz] [xyz]
[^xyz] 负值字符集合,匹配未包含的任意一个字符(注意:不包括换行符),例如:‘[^abc]‘ 可以匹配 "Lay" 中的‘L‘(注意:[^xyz]在awk 指令中则是匹配未包含的任意一个字符+换行符) [^xyz] [^xyz] [^xyz] [^xyz]
[A-Za-z] 匹配大写字母或者小写字母中的任意一个字符(注意:要写成递增) [A-Za-z] [A-Za-z] [A-Za-z] [A-Za-z]
[^A-Za-z] 匹配除了大写与小写字母之外的任意一个字符(注意:写成递增) [^A-Za-z] [^A-Za-z] [^A-Za-z] [^A-Za-z]
\d 匹配从 0 到 9 中的任意一个数字字符(等价于 [0-9]) 不支持 不支持 \d \d
\D 匹配非数字字符(等价于 [^0-9]) 不支持 不支持 \D \D
\S 匹配任何非空白字符(等价于[^\f\n\r\t\v]) 不支持 不支持 \S \S
\s 匹配任何空白字符,包括空格、制表符、换页符等等(等价于[ \f\n\r\t\v]) 不支持 不支持 \s \s
\W 匹配任何非单词字符 (等价于[^A-Za-z0-9_]) \W \W \W \W
\w 匹配包括下划线的任何单词字符(等价于[A-Za-z0-9_]) \w \w \w \w
\B 匹配非单词边界,例如:‘er\B‘ 能匹配 "verb" 中的‘er‘,但不能匹配"never" 中的‘er‘ \B \B \B \B
\b 匹配一个单词边界,也就是指单词和空格间的位置,例如: ‘er\b‘ 可以匹配"never" 中的 ‘er‘,但不能匹配 "verb" 中的‘er‘ \b \b \b \b
\t 匹配一个横向制表符(等价于 \x09和 \cI) 不支持 不支持 \t \t
\v 匹配一个垂直制表符(等价于 \x0b和 \cK) 不支持 不支持 \v \v
\n 匹配一个换行符(等价于 \x0a 和\cJ) 不支持 不支持 \n \n
\f 匹配一个换页符(等价于\x0c 和\cL) 不支持 不支持 \f \f
\r 匹配一个回车符(等价于 \x0d 和\cM) 不支持 不支持 \r \r
\\ 匹配转义字符本身"\" \\ \\ \\ \\
\cx 匹配由 x 指明的控制字符,例如:\cM匹配一个Control-M 或回车符,x 的值必须为A-Z 或 a-z 之一,否则,将 c 视为一个原义的 ‘c‘ 字符 不支持 不支持   \cx
\xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长,例如:‘\x41‘ 匹配 "A"。‘\x041‘ 则等价于‘\x04‘ & "1"。正则表达式中可以使用 ASCII 编码 不支持 不支持   \xn
\num 匹配 num,其中 num是一个正整数。表示对所获取的匹配的引用 不支持 \num \num  
[:alnum:] 匹配任何一个字母或数字([A-Za-z0-9]),例如:‘[[:alnum:]] ‘ [:alnum:] [:alnum:] [:alnum:] [:alnum:]
[:alpha:] 匹配任何一个字母([A-Za-z]), 例如:‘ [[:alpha:]] ‘ [:alpha:] [:alpha:] [:alpha:] [:alpha:]
[:digit:] 匹配任何一个数字([0-9]),例如:‘[[:digit:]] ‘ [:digit:] [:digit:] [:digit:] [:digit:]
[:lower:] 匹配任何一个小写字母([a-z]), 例如:‘ [[:lower:]] ‘ [:lower:] [:lower:] [:lower:] [:lower:]
[:upper:] 匹配任何一个大写字母([A-Z]) [:upper:] [:upper:] [:upper:] [:upper:]
[:space:] 任何一个空白字符: 支持制表符、空格,例如:‘ [[:space:]] ‘ [:space:] [:space:] [:space:] [:space:]
[:blank:] 空格和制表符(横向和纵向),例如:‘[[:blank:]]‘ó‘[\s\t\v]‘ [:blank:] [:blank:] [:blank:] [:blank:]
[:graph:] 任何一个可以看得见的且可以打印的字符(注意:不包括空格和换行符等),例如:‘[[:graph:]] ‘ [:graph:] [:graph:] [:graph:] [:graph:]
[:print:] 任何一个可以打印的字符(注意:不包括:[:cntrl:]、字符串结束符‘\0‘、EOF 文件结束符(-1), 但包括空格符号),例如:‘[[:print:]] ‘ [:print:] [:print:] [:print:] [:print:]
[:cntrl:] 任何一个控制字符(ASCII 字符集中的前 32 个字符,即:用十进制表示为从 0 到31,例如:换行符、制表符等等),例如:‘ [[:cntrl:]]‘ [:cntrl:] [:cntrl:] [:cntrl:] [:cntrl:]
[:punct:] 任何一个标点符号(不包括:[:alnum:]、[:cntrl:]、[:space:]这些字符集) [:punct:] [:punct:] [:punct:] [:punct:]
[:xdigit:] 任何一个十六进制数(即:0-9,a-f,A-F) [:xdigit:] [:xdigit:] [:xdigit:] [:xdigit:]

学习资料

1、正则表达式30分钟入门教程。这是一篇非常好的文档,笔者当年就是看这篇文章学会正则表达式的。

http://deerchao.net/tutorials/regex/regex.htm

参考文献

1、维基百科

2、博客园,学院派的驴,《各种流派的正则表达式说明以及shell正则表达式》

http://www.cnblogs.com/finallyliuyu/archive/2013/05/27/3101220.html

Linux中grep、egrep正则表达式的使用

时间: 2024-08-24 20:21:01

Linux中grep、egrep正则表达式的使用的相关文章

Linux中 grep/egrep的命令收集

语法: grep  [-cinvABC]  'word'  filename -c :打印符合要求的行数 -i :忽略大小写 -n :在输出符合要求的行的同时连同行号一起输出 -v :打印不符合要求的行 -A :后跟一个数字(有无空格都可以),例如 –A2则表示打印符合要求的行以及下面两行 -B :后跟一个数字,例如 –B2 则表示打印符合要求的行以及上面两行 -C :后跟一个数字,例如 –C2 则表示打印符合要求的行以及上下各两行 例题: 包含 'halt' 的行以及这行下面的两行都打印出:

Linux 命令grep, egrep,正则表达式大全

Linux grep 命令     Linux系统中grep,egrep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户. 1.grep : 最早的文本匹配程序,使用POSIX定义的基本正则表达式(BRE)来匹配文本. 2.egrep : 扩展式grep,其使用扩展式正规表达式(ERE)来匹配文本. 3.fgrep : 快速grep,这个版

[Linux 006]——grep和正则表达式

在使用系统时,我们或多或少的有一些搜索.查找的需求,必须要在文本中搜索某个关键字,或者过滤出文本中某些特定的行.grep 命令就为我们提供了这样一个功能,同时,grep 还可以使用正则表达式进行匹配,这是一个强大的功能,有必要好好掌握. 1.grep 初体验 grep PATTERN [OPTIONS] FILE:在文件中按照模式进行查找.FILE 是我们要查找的目标文件,如果不指定目标文件,grep 将会从标准输入中读取输入的内容,然后进行匹配.为了方便起见,本文的所有演示都在命令行中通过标准

linux中grep和find的用法区别

linux中grep和find的用法区别 本文章详细的介绍了关于在linux中的grep和find两个命令的用法介绍,以及后面总结了它们两年用法区别哦. 先我们来介绍一下关于grep用法和一些小注意事项 使用过程中,使用最多的参数就是 -v ,但是用着并不爽. 比如说,我想查找一个单词“UserService”,但是像”*.svn” 这种文件就不用显示了,我该怎么做呢? 代码如下 复制代码 grep -r "UserService" ./ | grep -v "svn&quo

12个 Linux 中 grep 命令的超级用法实例

12个 Linux 中 grep 命令的超级用法实例 你是否遇到过需要在文件中查找一个特定的字符串或者样式,但是不知道从哪儿开始?那么,就请grep来帮你吧. grep是每个Linux发行版都预装的一个强有力的文件模式搜索工具.无论何种原因,如果你的系统没有预装它的话,你可以很容易的通过系统的包管理器来安装它(Debian/Ubuntu系中的apt-get和RHEl/CentOS/Fedora系中的yum). $ sudo apt-get install grep #Debian/Ubuntu

Linux中Grep常用的15个例子【转】

转自:https://www.aliyun.com/jiaocheng/1390860.html?spm=5176.100033.1.9.6a1e41e8Pdjynm 摘要:Grep命令主要用于从文件中查找指定的字符串.首先建一个demo_file:$catdemo_fileTHISLINEISTHE1STUPPERCASELINEINTHISFILE.thislineisthe1stlowercaselineinthisfile.ThisLineHasAllItsFirstCharacterO

Linux中grep与egrep的知识

在Linux中,有条基本哲学"使用文本文件来保存配置信息".这就意味着在日常操作中需要大量的针对文本文件进行操作.在学习过程中我 们用来练习或者作为范例的文本文件通常比较短小,但在实际工作中可能情况就会大不相同,所以如何在熬长的内容中尽快找到我们想要的数据就是一个很重要的工 作.而grep就是来解决这个问题的. gerp是一个文本处理工具,也可以说是一个文本搜索工具.其可以根据我们的想法来设定相应的搜索方式来帮助我们来迅速查找到想要解数据. 用法: grep [OPTIONS] PAT

linux中grep命令-From cyber

1.作用 Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expr ession Print,表示全局正则表达式版本,它的使用权限是所有用户. 2.格式 grep [options] 3.主要参数 [options]主要参数: -c:只输出匹配行的计数. -I:不区分大 小写(只适用于单字符). -h:查询多文件时不显示文件名. -l:查询多文件时只输出包含匹配字符的文件名. -n:显示匹配行及

linux学习-grep使用正则表达式示例

在linux上使用grep配合正则表达式可以产生强大的搜索的效果,由于正则表达式中含有较多的特殊字符,所以结合grep时,最好使用单引号将表达式括起来,以免造成错误.首先创建一个文件RegExp.txt,文本内容如下所示: --------TEXT BEGIN------------- good morining teacher hellp world is as script gold sunshine looks beautiful golden time files god belss m