一、grep(文本搜索工具):根据用户指定的模式,对目标文件进行过滤,显示被模式匹配到的行。

使用格式:grep  [选项]  ‘模式’  文件名

                 -o    仅显示匹配到的内容,不会把正行输出

                 -v    反向选取,把没有匹配到的行显示出来

                 --color 高亮显示匹配到的内容 

                 -i    忽略字符大小写

                 -E    使用扩展正则表达式

                 -A  # 匹配模式及其下面#行

                 -B  # 匹配模式及其上面#行

                 -C  # 匹配模式及其上面#行和下面#行

模式(正则表达式):由一类字符书写的模式,其中有一些字符不表示字符字面的意义,而是表示通配功能。

1、基本正则表达式 元字符:

  .   匹配任意单个字符

  []  匹配指定集合内的任意单个字符

  [0-9]  [[:digit:]]  数字集合

  [a-z]  [[:lower:]]  小写字母集合

  [A-Z]  [[:upper:]]  大写字母集合

  [a-zA-Z]  [[:alpha:]]  大小写字母

  [0-9a-zA-Z]   [[:alnum:]]   数字和大小写字面集合

  [[:space:]]  空白字符集合

  [^] 匹配的是集合外的任意单个字符 例如[^[:lower:]]指的是除小写字母外的任意单个字符

2、匹配次数:用于对其前面紧邻的字符所能出现的次数作出限定。

 *     匹配其前面的字符任意次 

           grep  ‘x*y’

          xy  xxy  xxxy  y

 \?    匹配其前面字符0此或一次

           grep 'x\?y'

          xy  xxy y   xxxxy  aby

 \+    匹配其前面字符至少出现一次

 \{m\} 匹配其前面字符m次

           grep   'x\{2\}y'

         xy   xxy  y aaxxy aby  xxxy

 \{m,n\}:匹配其前面的字符至少出现m次,至多出现n次

          x\{3,5\}

3、位置锚定

^:行首锚定,写在模式的最左侧

例:显示/etc/fstab文件中以#开头的行

$:行尾锚定,写在模式的最右侧

例:显示/etc/fstab文件中以0结尾的行

^$: 空白行(连空格都没有)

例:显示/etc/fstab文件中的空白行

\<  词首锚定   

例:\<open 以open开头的单词

\>  词尾锚定

\<单词\> 单词锚定

例:匹配/tmp/sort文件中的两位数

4、分组:\(\) 

  后向引用:反向引用,指把匹配出来的组引用到表达式本身其它地方  \(\) \1  \2 

  选择字符:\|

练习1、显示/proc/meminfo文件中以大写或小写S开头的行;

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

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

      进一步:仅显示上述结果中其ID号最大的用户;

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

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

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

练习7、找出netstat -tan命令执行结果中以'LISTEN'(后可有空白字符)结尾的行;

练习8、添加用户bash, testbash, basher, nologin(SHELL为/sbin/nologin),而找出当前系统上其用户名和默认shell相同的用户;

练习9、扩展题:新建一个文本文件,假设有如下内容:

    He like his lover.

    He love his lover.

    He like his liker.

    He love his liker.

找出其中最后一个单词是由此前某单词加r构成的行。

二、扩展正则表达式

egrep  [选项]  ‘模式’  文件名

1、元字符

 .   匹配任意单个字符

[]  匹配指定集合内的任意单个字符

[0-9]  [[:digit:]]  数字集合

[a-z]  [[:lower:]]  小写字母集合

[A-Z]  [[:upper:]]  大写字母集合

[a-zA-Z]  [[:alpha:]]  大小写字母

[0-9a-zA-Z]   [[:alnum:]]   数字和大小写字面集合

[[:space:]]  空白字符集合

[^] 匹配的是集合外的任意单个字符

2、匹配次数:用于对其前面紧邻的字符所能出现的次数作出限定

*    匹配其前面的字符任意次 

?    匹配其前面字符0此或一次

+    匹配其前面字符至少出现一次

{m}  匹配其前面字符m此

{m,n}:匹配其前面的字符至少出现m次,至多出现n次

3、位置锚定

^:行首锚定,写在模式的最左侧

$:行尾锚定,写在模式的最右侧

^$  空白行

\<  词首锚定 

 \>  词尾锚定

 \<单词\>单词锚定

4、 分组

()

'([0-9]) ([a-z]) \1 \2'

 |   选择字符

练习10:显示当前系统上root、centos或user1用户的默认shell及用户名;练习11:找出/etc/rc.d/init.d/functions文件中某单词后面跟一对小括号"()"的行;

练习12:使用echo输出一个路径,而使用egrep取出其基名;

练习13:找出ifconfig命令结果中的1-255之间的数值

练习14:找出ifconfig命令结果中的IP地址;(ip范围 1.0.0.1 - 223.255.255.254)

ifconfig|grep --color '\<\([1-9]\|[1-9][0-9]\|1[0-9][0-9]\|2[0-2][0-3]\)\.\([0-9]\|[1-9][0-9]\|\|1[0-9][0-9]\|2[0-5][0-5]\)\.\([0-9]\|[1-9][0-9]\|\|1[0-9][0-9]\|2[0-5][0-5]\)\.\([1-9]\|[1-9][0-9]\|1[0-9][0-9]\|2[0-5][0-4]\)\>'