码迷,mamicode.com
首页 > 其他好文 > 详细

grep egrep及相关的正则表达式用法

时间:2015-04-08 01:11:38      阅读:245      评论:0      收藏:0      [点我收藏+]

标签:grep egrep 正则表达式

一、什么是正则表达式

在编写处理字符串的时候,经常需要查询某些符合复杂规则的字符串,正则表达式就是描述这些规则的工具。

正则表达式有基本表达式和扩展正则表达式。扩展正则表达式,是基本正则表达式的补充。有些元字符,稍有不同。

二、正则表达式的组成部分:

元字符正常字符所书写,元字符不表达字符本意,而表达控制或通配的功能;

2.1基本正则表达式/扩展正则表达式元字符

字符匹配:【基本/扩展正则表达式元字符相同】

基本/元字符:

扩展/元字符:

说明:

.  

.  

匹配任意单个字符

[]

[]

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

[^]

[^]

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

一些常见的字符集:

数字 [0-9],[[:digit:]],[^0-9],[^[:digit:]]

小写字母 [a-z],[[:lower:]]

大写字母 [A-Z],[[:upper:]]

所有字母 [a-zA-Z],[[:alpha:]]

标点符号   [[:punct:]]

空白字符   [[:space:]]

字母与数字 [0-9a-zA-Z],[[:alnum:]]

次数匹配:【省去特殊符号的脱字符】

基本/元字符:

扩展/元字符:

说明:

*

*

匹配其前字符,0次或多次

\?

?

匹配其前字符,0次或1次

\+

+

匹配其前字符,1次或多次

\{m\}

{m}

匹配其前字符,精确匹配m次

\{m,n\} 

{m,n} 

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

 

基本/元字符:

扩展/元字符:

说明:

.*

.*

匹配任意字符任意次

\{0,n\}

{0,n}

匹配其前字符最多n次

\{m,\}

{m,}

匹配其前字符至少m次

位置锚定:【基本/扩展正则表达式元字符相同】

基本/元字符:

扩展/元字符:

说明:

^

^

锚定行首;用法:^字符串

$

$

锚定行尾;用法:字符串$

\<

\<

锚定词首,也可用\b

\>

\>

锚定词尾,也可用\b

^字符串$

^字符串$

用模式匹配整行

\<字符串\>

\<字符串\>

匹配字符串匹配到的整个单词

注意区别:   ^$               匹配空行 

            ^[[:space:]]*$   有Tab或空格或无字符的行

分组\(\)【基本/扩展正则表达式元字符相同】

基本/元字符:

扩展/元字符:

说明:

\(\)

\(\)

匹配词组,该词组可以被(内置变量,如\1,\2...)记忆

\1

\1

引用,由左至右,第一个左括号与之对应的右括号中的内容

分组\(\)与锚定\<\>一个词组,区别是:分组可以方便以后使用\1的引用

或者:

基本/元字符:

扩展/元字符:

说明:

a|b

a或者b 或者两侧所有内容

注意区别:abc|Cba      表示匹配abc或者Cda

          ab(c|C)ba    表示匹配abcba或者abCba

一、如何使用正则表达式

通常,我们是通过文本搜索工具,以行为单位,全局搜索并显示正则表达式匹配的内容。其主要命令有:grepegrep[grep -E]fgrep

3.1基本正则表达式的使用

grep

Global search REgular expression and Print out the line.全局搜索正则表式和打印

grep用法:grep 选项 匹配模式 文件

    选项:--color[=WHEN], --colour[=WHEN]

              autoalwaysnever

          -o: 只显示被模式匹配到的内容

          -i: ignore case,不区分字符大小写

          -v: 显示不能够被模式匹配到的行

          -E:使用扩展的正则表达式

              -A #: 显示行后#行

              -B #:  显示行前#行

              -C #:  显示行前行后#行

#grep --color=auto "root" /etc/passwd

技术分享

例二:#grep -o "root" /etc/passwd

技术分享

例三:#grep --color=auto -A 1 root /etc/passwd

技术分享

3.2扩展正则表达式使用

egrep用法:egrep 匹配模式 文件

    选项:--color[=WHEN], --colour[=WHEN]

              autoalwaysnever

          -o: 只显示被模式匹配到的内容

          -i: ignore case,不区分字符大小写

          -v: 显示不能够被模式匹配到的行

          -E:使用扩展的正则表达式

              -A #: 显示行后#行

              -B #:  显示行前#行

              -C #:  显示行前行后#行

egrep等同于grep -E,使用扩展表达式元字符

四、练习使用正则表达式

4.1一般正则表达式练习

声明:为查看更清晰,采用命令别名定义grep显示颜色,截图省略部分行。

alias grep="grep --color=auto"

技术分享

1、显示/proc/meminfo文件中以大写或小写S开头的行;用两种方式;

# grep "^[sS]" /proc/meminfo

# grep "^s" /proc/meminfo

技术分享

技术分享

2、显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;

思路:找shell为nologin的,采用-v参数取反,再截取用户名

# grep -v "/sbin/nologin$" /etc/passwd | cut -d: -f1

技术分享

3、显示/etc/passwd文件中其默认shell为/bin/bash的用户;

# grep "/bin/bash$" /etc/passwd | cut -d: -f1

技术分享

4、找出/etc/passwd文件中的一位数或两位数;

# grep "\<[0-9]\{1,2\}\>" /etc/passwd

技术分享

5、显示/boot/grub/grub.conf中以至少一个空白字符开头的行;

# grep "^[[:space:]]\+" /boot/grub/grub.conf

技术分享

6、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;

# grep "^#[[:space:]]\+[^[:space:]]\+" /etc/rc.d/rc.sysinit

技术分享

7、打出netstat -tan命令执行结果中以‘LISTEN’,后或跟空白字符结尾的行;

# netstat -tan | grep "LISTEN[[:space:]]\+$"

技术分享

8、添加用户bash, testbash, basher, nologin (此一个用户的shell为/sbin/nologin),而后找出当前系统上其用户名和默认shell相同的用户的信息;

# grep "^\([[:alnum:]]\+\>\).*\1$" /etc/passwd

技术分享

还可通过#cat /etc/passwd查看以下用户

技术分享

技术分享

技术分享

 

4.2扩展正则表达式练习:

1、显示/proc/meminfo文件中以大写或小写S开头的行;用三种方式;

# egrep -i "^s" /proc/meminfo

# grep -E "^[sS]" /proc/meminfo

# grep -E "^(s|S)" /proc/meminfo

技术分享

技术分享

技术分享

2、显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;

# egrep -v "/sbin/nologin$" /etc/passwd | cut -d: -f1

技术分享

3、显示/etc/passwd文件中其默认shell为/bin/bash的用户;

# egrep "/bin/bash$" /etc/passwd | cut -d: -f1

技术分享

4、找出/etc/passwd文件中的一位数或两位数;

# egrep --color=auto "\<[0-9]{1,2}\>" /etc/passwd

技术分享

5、显示/boot/grub/grub.conf中以至少一个空白字符开头的行;

# egrep "^[[:space:]]+" /boot/grub/grub.conf

技术分享

6、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;

# egrep "^#[[:space:]]+[^[:space:]]+" /etc/rc.d/rc.sysinit

技术分享

7、打出netstat -tan命令执行结果中以‘LISTEN’,后或跟空白字符结尾的行;

# netstat -tan | egrep "LISTEN[[:space:]]*$"

技术分享

8、添加用户bash, testbash, basher, nologin (此一个用户的shell为/sbin/nologin),而后找出当前系统上其用户名和默认shell相同的用户的信息;

# egrep "^([[:alnum:]]+\>).*\1$" /etc/passwd

技术分享

9、显示当前系统上root、fedora或user1用户的默认shell;

# grep -E "^(root|fedora|user1)\>" /etc/passwd | cut -d: -f1,7

技术分享

技术分享

10、找出/etc/rc.d/init.d/functions文件中某单词后面跟一组小括号的行,形如:hello();

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

技术分享

11、使用echo命令输出一个绝对路径,使用grep取出其基名;

# echo /etc/rc.d/init.d/functions | grep -o -E "[[:alnum:]]+/?$" | cut -d/ -f1

技术分享

扩展:取出其路径名

[root@localhost ~]# echo "/" |egrep -o --color=auto "^/|/.*[[:alnum:]]" | egrep -o "/|/.*[^[:alnum:]]"

技术分享

12、找出ifconfig命令结果中的1-255之间数字;

# ifconfig | grep -E "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"

技术分享

 

13、挑战题:写一个模式,能匹配合理的IP地址;

1.0.0.1 -- 239.255.255.255 注意()的位置

"\<[1-9]\>|\<[1-9][0-9]\>|\<1[0-9][0-9]\>|\<2[0-3][0-9]\>"1-239

"\<[0-9]\>|\<[1-9][0-9]\>|\<1[0-9][0-9]\>|\<2[0-4][0-9]\>|\<25[0-5]\>"0-255

#ifconfig |egrep --color=auto ‘(\<[1-9]\>|\<[1-9][0-9]\>|\<1[0-9][0-9]\>)\.(\<[0-9]\>|\<[1-9][0-9]\>|\<1[0-9][0-9]\>|\<2[0-4][0-9]\>|\<25[0-5]\>)\.(\<[0-9]\>|\<[1-9][0-9]\>|\<1[0-9][0-9]\>|\<2[0-4][0-9]\>|\<25[0-5]\>)\.(\<[0-9]\>|\<[1-9][0-9]\>|\<1[0-9][0-9]\>|\<2[0-4][0-9]\>|\<25[0-5]\>)‘

技术分享

 

 

 

 

本文出自 “TER_PRC” 博客,请务必保留此出处http://terprc.blog.51cto.com/9722198/1629865

grep egrep及相关的正则表达式用法

标签:grep egrep 正则表达式

原文地址:http://terprc.blog.51cto.com/9722198/1629865

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!