正则表达式第一关之grep

很多学linux的同学和我一样,鸟哥的私房菜里每次读到正则表达式那一章,就感觉缺乏攻破它的勇气了,如果你和我一样也是刚进入linux世界的菜鸟,不妨多总结里面的基本用法以及一些特别需要注意的地方,相信你和我一样,不妨多反复揣摩,相信你也可以熟练掌握它,所谓书读百变起义自现。

刚接触的你肯定会疑问什么是正则表达式(Regular Expression),简单的讲正则表达就是处理字符串的方法,有点像word里的查找替换,不过它可比word里的查找替换强大N倍,它是以行为单位来进行字符串处理行为,通过一些特殊符号的辅助,轻松的帮你查找、删除、替换某些特定字符串的处理程序。下面让我们一起去攻破正则表达的第一个命令grep。

本文的主要内容包括以下内容:

1.什么是grep命令

2.grep命令格式及说明

3.常用选项及示例

4.匹配模式之正则表达式

5.匹配模式之扩展正则表达式

6.总结

一、什么是grep命令

grep(global search regular expression_r(RE) and print out theline),这是我们接触到的第一个文本搜索工具,之前我们就说过正则表达式是对行进行操作的,所以grep也是根据我们指定的文本模式对目标文件进行逐行进行搜索,显示能够被模式所匹配到的行。简单点说呢,就是给grep命令一个模板,它会按照这个模板在文本里一行一行的扫描你想要的内容,搜索到的结果被直接送到你的屏幕上,不影响原文件内容,当然我们也可以通过管道重定向等方式进行其他包括替换删除等操作再送到你的屏幕上,也可以保存到文件里,而原文件可以保持不变。Egrep(grep -E)、fgrep(fgrep ‘PATTERN‘ FILE...不支持正则表达式)与之相近,均可以通过grep命令与不同的选项组合实现,因此在本文中,我们不再进行过多描述。

 

二、grep命令格式及说明

格式:grep [options] ‘PATTERN’ file,…

说明:PATTERN是搜索文本的关键,grep用PATTERN正则表达式来搜索文本中的每一行,在贪婪的模式下(命令尽可能多的匹配行内的字串),尽力去匹配。

 

三、常用选项及示例


--color=auto  -n


将搜索出的符合条件的行的匹配上的字符自动着色显示;显示行号


-v


反向查找,显示出不能被模式匹配到的行


-E


支持扩展正则表达式


-i


不区分字符大小写


-o


仅显示被模式匹配到的字串,而非整行


-A #


显示被匹配到的行,包括它之后的#行(#表示正整数)


-B #


显示被匹配到的行,包括它之前的#行(#表示正整数)


-C #


显示被匹配到的行,包括它前后的#行(#表示正整数)

示例

1.-n 显示文本所在的行号,搜索以nologin结尾的行。


1

2

3

4


[[email protected]~]# grep --color=auto -n "nologin$" /etc/passwd

2:bin:x:1:1:bin:/bin:/sbin/nologin

3:daemon:x:2:2:daemon:/sbin:/sbin/nologin

4:adm:x:3:4:adm:/var/adm:/sbin/nologin

2.-v 反向显示。显示不是以nologin为结尾的行


1

2

3

4

5


[[email protected]~]# grep --color=auto -n -v  "nologin$" /etc/passwd

1:root:x:0:0:root:/root:/bin/bash

6:sync:x:5:0:sync:/sbin:/bin/sync

7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

8:halt:x:7:0:halt:/sbin:/sbin/halt

3.-i 不区分大小写。显示以root为开头的行。


1

2

3


[[email protected]~]# grep --color=auto -i "^root" /etc/passwd

root:x:0:0:root:/root:/bin/bash

Root:x:500:500::/home/Root:/bin/bash

4.-o 只显示匹配的字串,而不是整行。显示以root开头的行


1

2

3


[[email protected]~]#  grep --color=auto -o "^root" /etc/passwd

root

[[email protected]~]#

5.-A # 显示匹配到行的后#行。搜索以ftp开头的行


1

2

3

4

5

6


[[email protected]~]# grep --color=auto -A 3 "^ftp" /etc/passwd

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

nobody:x:99:99:Nobody:/:/sbin/nologin

dbus:x:81:81:System message bus:/:/sbin/nologin

usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin

[[email protected]~]#

6.-B # 显示匹配到行的前#行。搜索以ftp开头的行


1

2

3

4

5

6


[[email protected]~]# grep --color=auto -B  3 "^ftp" /etc/passwd

operator:x:11:0:operator:/root:/sbin/nologin

games:x:12:100:games:/usr/games:/sbin/nologin

gopher:x:13:30:gopher:/var/gopher:/sbin/nologin

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

[[email protected]~]#

 

四、匹配模式之基本正则表达式

在grep命令格式中的PATTERN正则表达式是重点和难点。学好正则表达式,“走遍天下都不怕”,在vim的末行模式等场景下,正则表达式都有出色的表现。这里总结正则表达式元字符(不表示字符本身的意义,用于额外功能性的描述)。并辅以实例说明。在原元字符中经常可以看到的\,是转义符。在扩展正则表达式中是不需要的。

1.字符匹配


.


任意单个字符


[]


指定范围内的任意单个字符,

[0-9], [[:digit:]]

[a-z], [[:lower:]]

[A-Z], [[:upper:]]

[[:alpha:]]

[[:alnum:]]

[[:space:]]

[[:punct:]]   类似通配符里的内容


[^]


指定范围外的任意单个字符

此处建立实验用文本test.txt,test1.txt内容为


1

2

3

4

5

6

7


#test.txt

abc

abcd

aaaa

acdgssd

sddes

dseega

1-1 . 匹配任意单个字符。


1

2

3

4


[[email protected]localhost~ ~]# grep --color=auto "a.c" /tmp/test.txt

abc

abcd

[[email protected]localhost~]#

注:这里要匹配到a与c中间有一个任意字符的行

1-2 []指定范围内的任意字符。查找所有包含s或g的字串


1

2

3

4

5


[[email protected]localhost~]# grep --color=auto "[sg]" /tmp/test.txt

acdgssd

sddes

dseega

[[email protected]localhost~]#

注:这里查找到了,a或者b开头的行,[ab]二者选其一。其他类似,不再一一列举。

1-3 [^] 指定范围外的任意单个字符。搜索不包含a的字串


1

2

3

4

5

6

7


[[email protected]localhost~]# grep --color=auto "[^a]" /tmp/test.txt

abc

abcd

acdgssd

sddes

dseega

[[email protected]localhost~]#

2.次数匹配

此处的匹配的次数指的是元字符前面的那个字符。


*


匹配其前面的字符任意次


\?


匹配其前面的字符0次或1次


\{m\}


匹配其前面的字符匹配m次


\{m,n\}


匹配其前面的字符至少m次,至多n次


\{m,\}


匹配其前面的字符至少m次


\{0,n\}


匹配其前面的字符至多n次

实验文本test1.txt


1

2

3

4

5


#test1.txt

xxy

xy

y

xxy

2-1 *  任意次数。


1

2

3

4

5

6


[[email protected]localhost~]# grep --color "x*y" test1.txt

xxy

xy

y

xxy

[[email protected]localhost~]#

注:y前面可以出现任意个x,包括0个

2-2 \? 0次或1次


1

2

3

4


[[email protected]localhost~]# grep --color "roo\?t" /etc/passwd

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

[[email protected]localhost~]#

注:root,o出现了一次

2-3 \{m\}匹配m次。


1

2

3

4


[[email protected]localhost ~]# grep --color "ro\{2\}t" /etc/passwd

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

[[email protected]localhost ~]#

注:出现两次o

2-4 \{m,n\}至少m次,至多n次


1

2

3

4

5


[[email protected]localhost~]# grep --color "x\{1,2\}y" test1.txt

xxy

xy

xxy

[[email protected]localhost~]#

注:这里,x最少出现一次,最多出现了2次

2-5 \{m,\}至少m次


1

2

3

4

5


[[email protected]localhost ~]# grep --color "x\{1\}y" test1.txt

xxy

xy

xxy

[[email protected]localhost ~]#

注:至少出现1次,因此y那一行由于是0次没有显示出来

2-6 \{0,n\}至多n次


1

2

3

4


[[email protected]localhost ~]# grep --color "x\{2\}y" test1.txt

xxy

xxy

[[email protected]localhost~ ~]#

注:最多出现2次x

3.位置锚定

位置锚定是通过一定的格式,将一些字符或者字符串固定在想要的位置上。


^


锚定行首


$


锚定行尾


^$


空白行


\<


锚定词首


\>


锚定词尾

演示用文本


1

2

3

4

5

6


xxy

xy

y

xxy

axyxyb

abc

3-1 ^ 锚定词首。显示以root开头的行。


1

2

3


[[email protected]localhost~]# grep --color "^root" /etc/passwd

root:x:0:0:root:/root:/bin/bash

[[email protected]localhost~]#

注:以root为行首的行

3-2 $ 锚定词尾。显示以bash为词尾的行


1

2

3

4

5

6

7

8


[[email protected]localhost~]# grep --color "bash$" /etc/passwd

root:x:0:0:root:/root:/bin/bash

Root:x:500:500::/home/Root:/bin/bash

testuser:x:501:501::/home/testuser:/bin/bash

user1:x:502:502::/home/user1:/bin/bash

Badguy:x:503:503::/home/Badguy:/bin/bash

Creayboy:x:504:504::/home/Creayboy:/bin/bash

[[email protected]localhost~]#

3-3 ^$ 不显示空白行。


1

2

3

4

5

6

7


[[email protected]localhost~]# grep --color -v "^$" test1.txt

xxy

xy

y

xxy

abc

[[email protected]localhost~ ~]#

注:此处使用了反向显示。

3-4 \<锚定词首


1

2

3


[[email protected]localhost~]# grep --color=auto "\<xy" test1.txt

xy

[[email protected]localhost~ ~]#

若不锚定词首,则会出现下面的结果


1

2

3

4

5

6


[[email protected]localhost~]# grep --color=auto "xy" test1.txt

xxy

xy

xxy

axyxyb

[[email protected]localhost~ ~]#

3-5 锚定词尾


1

2

3

4

5


[[email protected]localhost~]# grep --color=auto "xy\>" test1.txt

xxy

xy

xxy

[[email protected]localhost~]#

若不锚定词尾


1

2

3

4

5

6


[[email protected]localhost ~]# grep --color=auto "xy" test1.txt

xxy

xy

xxy

axyxyb

[[email protected]localhost ~]#

4.分组显示


\(\)


eg:\(ab)\*xy

如上实例,将ab做为一个分组,以组合的形式出现。在下面的引用中,做实例

5.引用


\1


后向引用。eg:\(a.b\)xy\1可以匹配到a6bxya6b


\2


多次后向引用,后面的数字可增大

示例用文本


1

2

3

4

5


#test2.txt

He like his lover.

She love her liker.

He love his lover.

She like her liker.

找出like对应liker,love对应lover的行


1

2

3

4


[[email protected]localhost~]# grep --color=auto "\(l..e\).*\1r" test2.txt

He love his lover

She like her liker

[[email protected]localhost~]#

注:这里,使用了后向引用和分组。将l..e固定为一个组,然后后向引用。

五、匹配模式之扩展正则表达式

扩展正则表达式与基本正则表达式十分相似,二者最主要的区别就是扩展正则表达式不使用转义字符。下面是二者元字符的对比表


字符匹配


基本正则表达式


扩展正则表达式


说明


.


.


任意单个字符


[]


[]


指定范围内的任意单个字符


[^]


[^]


指定范围外的任意单个字符


次数匹配


基本正则表达式


扩展正则表达式


说明


*


*


匹配其前面的字符任意次


\?


?


匹配其前面的字符0或1次


\{m\}


{m}


匹配其前面的字符m次


\{m,n\}


{m,n}


匹配其前面的字符至少m次,至多n次


\{m,\}


{m,}


匹配其前面的字符至少m次


\{0,n\}


{0,n}


匹配其前面的字符至多n次


----


+


匹配其前面的字符至少1次


位置锚定


基本正则表达式


扩展正则表达式


说明


^


^


锚定行首


$


$


锚定行尾


\<, \b


\<, \b


锚定词首


\>, \b


\>, \b


锚定词尾


分组


基本正则表达式


扩展正则表达式


说明


\(\)


()


分组

扩展正则表达式与基本正则表达式类似,因此不再给出示例。

六、结语

grep是文本搜索的利器,刚开始还是需要对其最基本的用法熟练于心,在bash的学习中,你会经常用到它,所以更多grep的高级用法在那边会体现出正则表达的强大功能,通过不断的练习,你会攻破学习linux路上正则表达式的第一关grep相关的运用技巧,其实在后期的总结中,你会发现我们菜鸟最最头疼的是那些符号的不确定,其实我们对最基本的东西还不是很熟练的所导致的,所以多总结多练,你可以的,JUST DO IT!

正则表达式第一关之grep

时间: 2024-10-08 16:22:02

正则表达式第一关之grep的相关文章

正则表达式的整理,grep、egrep

一.总纲(何为正则) 所谓正则,又称正则表达式.正规表示法.常规表示法(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表达式使用单个字符串来描述.匹配一系列符合某个句法规则的字符串.在很多文本编辑器里,正则表达式通常被用来检索.替换那些符合某个模式的文本.(维基百科如是说) 为了便于理解,可以将正则想象成为普通语言,普通字符对应的是普通文字,而元字符则对应语法,根据语言的规则,按照语法将文字组合起来,就会表述出你想说的话即

第一关课前练习题

1.1 第一关练习题 1.1.1 创建一个目录/data 1.1.1.1 方法:mkdir 创建目录 [[email protected] ~]# mkdir /data [[email protected] ~]# ls / a    data  etc   lib64      mnt     proc  selinux tmp bin  date  home  lost+found oldboy  root  srv     usr boot dev   lib   media      

第一关考试及解答

老男孩教育Linux运维就业班第一关课后学习效果能力上机大考察 (每题10分共130分,过100即可,请给出详细步骤) 1.创建目录/data/oldboy,并且在该目录下创建文件oldboy.txt,然后在文件oldboy.txt里写入内容"inet addr:10.0.0.8 Bcast:10.0.0.255 Mask:255.255.255.0"(不包含引号). 解答: [[email protected] ~]# mkdir -p /data/oldboy [[email pr

Linux-测试-第一关

转载自:oldboy 教育 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://oldboy.blog.51cto.com/2561410/1838020 老男孩教育linux+Python高薪运维就业班第一关课后上机实战大考察 (开课第三天上机考试题) (每题10分共130分,过100即可,请给出详细步骤) 1.创建目录/data/oldboy ,并且在该目录下创建文件oldboy.txt,然后在文件oldboy.txt里写入内

正则表达式解析 & awk/sed/grep实用实例总结文档

##正则表达式特殊字符解析 "^" 匹配行首 "$" 匹配行尾 "^$" 匹配整行为空,空行 grep -v "^$"    打印非空的行 "."  代表且只能代表任意一个字符 "*" 重复0个或多个前面一个的字符.例如"o*",重复一个或多个o ".*"  匹配所有字符.延伸: "^.*" -->以任意多个字符开头.&q

老男孩linux+Python高薪运维就业班第一关课后上机实战考试题

老男孩教育linux+Python高薪运维就业班第一关课后上机实战大考察 (开课第三天上机考试题) (每题10分共130分,过100即可,请给出详细步骤) 1.创建目录/data/oldboy ,并且在该目录下创建文件oldboy.txt,然后在文件oldboy.txt里写入内容"inet addr:10.0.0.8 Bcast:10.0.0.255 Mask:255.255.255.0"(不包含引号). 2.将题1中的oldboy.txt文件内容通过命令过滤只输出如下内容: 10.0

正则表达式及工具程序grep,egrep

写在前面: 如果此文有幸被某位朋友看见并发现有错的地方,希望批评指正.如有不明白的地方,愿可一起探讨. 什么是正则表达式?     见名知意,正则表达式也就是符合某种规则的表达式,它是由特殊字符和其他字符组成的字符串.要想以正则表达式的规则来处理字符串,就得需要使用支持正则表达式的工具程序(有时也被称为正则表达式引擎)才行,例如grep,egrep,vi,sed,awk等,用来从/boot/grub/grub.conf文件中提取结果的命令如下图所示. 基础正则表达式之工具程序grep     元

黑板客爬虫闯关第一关、第二关

上来先贴地址,刚入门的可以来van啊: 黑板客爬虫闯关 0x00 第一关 打开网址,看到如下页面: 先抱着试试看的心态在网址后面加上数字看看效果: 怕不是个循环,获取网页中的数字不断加到url中,验证猜想,继续试一试: ????? 那就把原来的数字换掉: 妙啊: 这里基本确定思路,获取网页内的数字,然后在将数字加入url进行循环提交 查看源码,确定获取的信息<h3>标签内,并使用re库匹配我们要的数字 import requests from bs4 import BeautifulSoup

shell脚本正则表达式三剑客之一(grep,egrep)

Shell脚本之正则表达式 一.正则表达式三剑客之一:grep 1.学习正则表达式前我们拿一个无用的配置文件作为测试练习 [[email protected] ~]# vim chen.txt #version=DEVEL System authorization information auth --enableshadow --passalgo=sha512# Use CDROM installation media cdrom thethethe THE THEASDHAS Use gra