当前位置:

Linux打怪通关攻略12grep 模式匹配命令

访客 2024-01-05 1029 0

grep模式匹配命令

基本操作

grep命令用于打印输出文本中匹配的模式串,它使用正则表达式作为模式匹配的条件。grep支持三种正则表达式引擎,分别用三个参数指定:

参数说明-EPOSIX扩展正则表达式,ERE-GPOSIX基本正则表达式,BRE-PPerl正则表达式,PCRE

不过在你没学过perl语言的大多数情况下你将只会使用到ERE和BRE,所以我们接下来的内容都不会讨论到PCRE中特有的一些正则表达式语法(它们之间大部分内容是存在交集的,所以你不用担心会遗漏多少重要内容)。

在通过grep命令使用正则表达式之前,先介绍一下它的常用参数:

参数说明-b将二进制文件作为文本来进行匹配-c统计以模式匹配的数目-i忽略大小写-n显示匹配文本所在行的行号-v反选,输出不匹配行的内容-r递归匹配查找-Ann为正整数,表示after的意思,除了列出匹配行之外,还列出后面的n行-Bnn为正整数,表示before的意思,除了列出匹配行之外,还列出前面的n行–color=auto将输出中的匹配项设置为自动颜色显示

注:在大多数发行版中是默认设置了grep的颜色的,你可以通过参数指定或修改GREP_COLOR环境变量。

使用正则表达式

使用基本正则表达式,BRE

  • 位置

查找/etc/group文件中以shiyanlou为开头的行

grep'shiyanlou'/etc/groupgrep'^shiyanlou'/etc/group

  • 数量
#将匹配以'z'开头以'o'结尾的所有字符串echo'zero\nzo\nzoo'|grep'z.*o'#将匹配以'z'开头以'o'结尾,中间包含一个任意字符的字符串echo'zero\nzo\nzoo'|grep'z.o'#将匹配以'z'开头,以任意多个'o'结尾的字符串echo'zero\nzo\nzoo'|grep'zo*'

注意:其中\n为换行符

  • 选择
#grep默认是区分大小写的,这里将匹配所有的小写字母echo'1234\nabcd'|grep'[a-z]'#将匹配所有的数字echo'1234\nabcd'|grep'[0-9]'#将匹配所有的数字echo'1234\nabcd'|grep'[[:digit:]]'#将匹配所有的小写字母echo'1234\nabcd'|grep'[[:lower:]]'#将匹配所有的大写字母echo'1234\nabcd'|grep'[[:upper:]]'#将匹配所有的字母和数字,包括0-9,a-z,A-Zecho'1234\nabcd'|grep'[[:alnum:]]'#将匹配所有的字母echo'1234\nabcd'|grep'[[:alpha:]]'

下面包含完整的特殊符号及说明:

特殊符号说明[:alnum:]代表英文大小写字母及数字,亦即0-9,A-Z,a-z[:alpha:]代表任何英文大小写字母,亦即A-Z,a-z[:blank:]代表空白键与[Tab]按键两者[:cntrl:]代表键盘上面的控制按键,亦即包括CR,LF,Tab,Del…[:digit:]代表数字而已,亦即0-9[:graph:]除了空白字节(空白键与[Tab]按键)外的其他所有按键[:lower:]代表小写字母,亦即a-z[:print:]代表任何可以被列印出来的字符[:punct:]代表标点符号(punctuationsymbol),即:",’,?,!,;,:,#,$…[:upper:]代表大写字母,亦即A-Z[:space:]任何会产生空白的字符,包括空格键,[Tab],CR等等[:xdigit:]代表16进位的数字类型,因此包括:0-9,A-F,a-f的数字与字节
  • 注意

之所以要使用特殊符号,是因为上面的[a-z]不是在所有情况下都管用,这还与主机当前的语系有关,即设置在LANG环境变量的值,zh_CN.UTF-8的话[a-z],即为所有小写字母,其它语系可能是大小写交替的如,“aAbB…zZ”,[a-z]中就可能包含大写字母。所以在使用[a-z]时请确保当前语系的影响,使用[:lower:]则不会有这个问题。

#排除字符echo'geek\ngood'|grep'[^o]'

^放到中括号内为排除字符,否则表示行首。

使用扩展正则表达式,ERE

要通过grep使用扩展正则表达式需要加上-E参数,或使用egrep

  • 数量
#只匹配"zo"echo'zero\nzo\nzoo'|grep-E'zo{1}'#匹配以"zo"开头的所有单词echo'zero\nzo\nzoo'|grep-E'zo{1,}'

推荐掌握{n,m}即可,?,*这几个不太直观,且容易弄混淆。

  • 选择
#匹配"www.shiyanlou.com"和"www.谷歌.com"echo'www.shiyanlou.com\nwww.百度.com\nwww.谷歌.com'|grep-E'www\.(shiyanlou|谷歌)\.com'#或者匹配不包含"百度"的内容echo'www.shiyanlou.com\nwww.百度.com\nwww.谷歌.com'|grep-Ev'www\.百度\.com'

因为.号有特殊含义,所以需要转义。

校招真题

小明在做数据分析的时候需要提取文件中关于数字的部分,同时还要提取用户的邮箱部分,但是有的行不是数组也不是邮箱,现在需要你在data2这个文件中帮助他用正则表达式匹配出数字部分和邮箱部分。

数据文件可以使用以下命令下载:

$cd/home/shiyanlou$wgethttps://labfile.oss.aliyuncs.com/courses/1/data2

下载后的数据文件路径为/home/shiyanlou/data2。

目标

在文件/home/shiyanlou/data2中匹配数字开头的行,将所有以数字开头的行都写入/home/shiyanlou/num文件。

在文件/home/shiyanlou/data2中匹配出正确格式的邮箱,将所有的邮箱写入/home/shiyanlou/mail文件,注意该文件中每行为一个邮箱。

答案

grep'^[0-9]'/home/shiyanlou/data2>/home/shiyanlou/numgrep-E'[[:alnum:]]@[[:alnum:]]\.com'maill/home/shiyanlou/data2>/home/shiyanlou/num

发表评论

  • 评论列表
还没有人评论,快来抢沙发吧~