grep正则表达式

一、grep

1grep定义

Globally search a Regular Expression and Print 

全局搜索(匹配正则表达式的)并打印

 

扩展命令:

egrep:扩展grep,相当于grep -E 命令,使用扩展正则匹配。

fgrepfast grep,不支持正则匹配的grep,只能匹配字符本来的意义。

 

grepegrep的区别是egrep支持更多扩展的正则

 

2grep参数(#代表数字)

-v:显示不匹配的行

-i:忽略字母大小写

-o:只打印匹配的字符

-E:扩展正则表达式

-A #:显示匹配的行以及匹配行后的#

-B #:显示匹配的行以及匹配行前的#

-C #:显示匹配的行以及匹配行前后的各#

--color:定义匹配字符的颜色

 

颜色标记匹配的字符配置:

alias grep='grep --color=auto'

alias egrep='egrep --color=auto'

 

永久生效修改文件/etc/bashrc添加上面两行内容

3、各个参数举例:

wKiom1XgMjzBZg8pAAFFX3cHFqs869.jpg 

二、正则表达式

 

1、字符匹配

. :匹配一个字符

[]:匹配范围内任意单个字符

[^]:匹配范围外任意单个字符

例:

原始文件

wKiom1XgMm_RD6VEAACAk2A_A0s750.jpg 

.:匹配任意一个字符

wKioL1XgNNTw2n-dAAA2XvX31WU219.jpg

[]:匹配ab两个字符

wKiom1XgMsiQl8vBAABo4Gqcf_c946.jpg 

[^]:匹配除了abc三个以外的任意字符

wKioL1XgNPGSdYQNAAB8hOPFAcE190.jpg

扩展

[0-9]  [[:digit:]] 匹配数字

[a-z]  [[:lower:]] 匹配小写字母

[A-Z]  [[:upper:]] 匹配大写字母  

[[:space:]]  匹配所有空白字符(空格,制表符,新行)

[0-9a-zA-Z] [[:alnum:]]  匹配字母及数字

[a-zA-Z]    [[:alpha:]]  匹配字母

[[:punct:]]  标点符号

 

2、次数匹配

:任意次数

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

\?0次或1

\+1次或多次

\{m\}m

\{m,n\}:至少m次,至多n

\{0,n\}:至多n

\{m,\}:至少m

例:

*:匹配l任意次数

wKiom1XgMujw9ublAACEEgVlopw445.jpg

.*:匹配h开头的任意行

wKioL1XgNRSS9Tx6AAA2Mg54Aqc699.jpg 

\?:匹配el字符,l可以是0次或1

wKiom1XgMxDws6X5AABqdTzJWkk064.jpg 

\+:匹配ell最少1

wKiom1XgMySSZR3tAABTTEhH9Sw444.jpg

\{m\}:匹配ell字符

wKiom1XgMzXQZXWmAAA5RFfmvz4107.jpg

\{m,n\}:匹配ell最少1次,最多2

wKioL1XgNWHAC-abAABWGHVAJVE069.jpg

\{0,n\}:匹配ell最多2次,

wKiom1XgM1uzMWYMAABp2WvJYv8981.jpg

\{m,\}:匹配ell最少1

wKioL1XgNYaxps0IAABVCeC9FAE024.jpg

3、定位匹配

^:匹配行首

$:匹配行尾

\<\b:匹配单词词首

\>\b:匹配单词词尾

例:

^:匹配以h开头的行

wKiom1XgM4DRhmcpAAA5zQ1caLo408.jpg

$:匹配以d结尾的行

wKiom1XgM5uArYW6AAAz5mxrgrc753.jpg

\<:匹配以h开头的单词

wKioL1XgNcPB6F1aAAA3Fx39Eyk321.jpg 

\>:匹配以o结尾的单词

wKioL1XgNeCBZJTqAABRQu3ntmc226.jpg 

\<\>:匹配单词hello

wKioL1XgNe_wlVafAABArQusfCQ667.jpg 

4、分组和引用

\(\):小括号内的为一组

\1,\2,……引用分组,1为第一个小括号内容,2为第二个小括号内容……

例:匹配以4个字符开头并且与开头相同4个字符结尾的行

wKiom1XgM-Hye5UrAAB6Nzb6qNA755.jpg 

5元字符总结:

正则表达式及grep

字符匹配:. [] [^]

次数匹配:* \+ \? \{\}

定位匹配: ^ $ \< \>

分组和后向引用:\(\) \1,\2……

 

扩展正则表达式及egrep

字符匹配:. [] [^]

次数匹配:* + ? {}

定位匹配:^ $ \< \>

分组和后向引用:() \1,\2……

或者:a|b 


扩展正则表达式举例(为省事和上面的例子顺序相同,只截了3个图)

wKioL1XgOreTzhEaAAH0qzB-9Kk716.jpg

wKiom1XgOJyTwrY3AAJ94JdKz44183.jpg

|:匹配w或W的行

wKioL1XgOuKysDKVAABmZ8apYqs265.jpg


 三、作业

1、显示/etc/passwd文件中以bash结尾的行

wKiom1XgVnvwcRNoAACKC82PYOs230.jpg

2显示/etc/passwd文件中的两位数或三位数

wKioL1XgWOigcr-hAAJCvTn6cpw644.jpg

3、显示`netstat -tan`命令结果中以‘LISTEN’后跟0个、1个或者多个空白字符结尾的行

wKiom1XgVu3ys_dVAACy9lDOzC8377.jpg

4添加用户bashtestbashbasher以及nologin用户(nologin用户的shell/sbin/nologin);而后找出/etc/passwd文件中用户名与其shell名相同的行

wKioL1XgWSqzJcfLAAGnffNF5n8911.jpg

5、显示当前系统上rootcentos或者user1用户的默认shellUID (请事先创建这些用户,若不存在)

wKioL1XgWVLjjUzjAAB0Dj7Drf8969.jpg

6、找出/etc/rc.d/init.d/functions文件中某单词(单词中间可以存在下划线)后面跟着一组小括号的行

wKiom1XgXyjyg7GMAAGuSM9kRc4330.jpg

7使用echo输出一个路径,而后egrep找出其路径基名;进一步的使用egrep取出其完整路径和目录名

目录名:

# echo /etc/rc.d/init.d/functions|grep -o '/.*/' |grep -o '\<[a-zA-Z.]\+\>/$'|grep -o '[a-zA-Z.]\+'

wKioL1XiYEbwQXODAAEGiUuGzMA063.jpg

8找出ifconfig命令执行结果中1-255之间的数字

# ifconfig |egrep '\<[1-9]\>|\<[1-9][0-9]\>|\<1[0-9][0-9]\>|\<2[0-4][0-9]\>|\<25[0-5]\>'

合并相同的[]为[]{},合并后简写结果

#ifconfig |egrep '\<[1-9]\>|\<[1-9][0-9]\>|\<1[0-9]{2}\>|\<2[0-4][0-9]\>|\<25[0-5]\>'

省略多余的\<\>,合并简写结果

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

wKiom1XgXxOAB-1cAAGmVLZrje0129.jpg