Centos的grep的正则表达式和扩展表达式

日期2015.08.28 备注:其简述来自于马哥课堂笔记

 grep

     grep是一个文本过滤工具根据用户指定的“模式(pattern)”逐行去搜索目标文本,打印匹配到的行;
     模式:由正则表达式的元字符及文本字符所编写的过滤条件;

     其中,元字符:字符不表示其字面意义,而用于表示通配或控制功能

     grep分为两类

            基本的正则表达式:BRE

            扩展的正则表达式:ERE

      grep 使用格式

      grep  [选项]   模式  [文件]

     其常用选项有

--color=auto:对匹配到的串做高亮显示; 备注:--color 默认的命令别名中已经定义了grep=grep --color了

 wKiom1Xf0M3SVoPwAADDM5iBgkU795.jpg

加上--color

wKioL1Xf0yDQUQ-7AADIYA9RH1c959.jpg

-v:显示模式匹配不到行;

wKiom1Xf0c6xfCRSAAEjOMXFeW8718.jpg

 -i: 忽略字符大小写;

wKioL1Xf_y6hHXouAADkA8CRnUI224.jpg

 -o: 仅显示能够被模式匹配到的字符串;

wKiom1XgARSDDUpQAAE7FHasBMs497.jpg

-q: 静默模式,匹配到什么也不显示。

wKiom1XgCCqxijc6AAEiBWLwlSY078.jpg

 -E:使用扩展的正则表达式;这里就不发图了后面有演示。  

  基本正则表达式的元字符:
 字符匹配:
 .: 匹配任意单个字符;

wKioL1XgH-uCJuqpAADgWSxXMGY170.jpg

[]:匹配指定范围内的任意单个字符;下图中[a-z]和[a-c]匹配字符就不一样,因为字符范围不同

wKioL1XgIEeQsJmnAACFlkJTwWA385.jpg

 [^]:匹配不在指定范围内的任意单个字符;

wKioL1XgJC6A-AVhAAB4s5fYmLI053.jpg

[:lower:]:小写字母

wKiom1XgJJexKEY3AADcIyjmNpk121.jpg

[:upper:]:大写字符

wKioL1XgJwSDEoeNAADACmVR9TI791.jpg

[:space:]:空白字符

wKiom1XgJfvze_5yAACZpjImw38933.jpg

[:punct:]:标点符号

wKioL1XgKJ-jn59tAABI8sCdaAU355.jpg

[:alpha:]:大小写字母;意思是所有的字母不分大小写

wKiom1XgKa3xQOyuAABd7mLVysM347.jpg

[:digit:]:数字

wKioL1XgMc-BRNJeAABjMQ7Nykk706.jpg

次数匹配:用于要指定其次数的字符的后面,表示指定其前面的字符

*: 任意次

\?:0或1次

\+:1或多次
\{m\}:精确限制为m次
\{m,n\}: 至少m次,至多n次,[m,n]
\{0,n\}:至多n次,少了可以没有
\{m,\}:至少m次,多则不限
.*: 匹配任意长度的任意字符

以上命令总结如下图:

wKioL1XgaF3SfUPCAAGx6yXkX_o825.jpg

 位置锚定:
 ^: 行首锚定;用于模式的最左侧;

wKioL1Xga2ixkMMqAADuIruMU_k822.jpg

 $: 行尾锚定;用于模式的最右侧; 注意,在Centos7后$来锚定行尾的时候要使用单引号。

wKiom1XgbQ6Aqdm2AAHeJFtIvCs818.jpg

 \<, \b: 词首锚定;用于表示单词的模式的左侧;

wKioL1XgdW6wDYZLAAIKlIUZZdI196.jpg

 \>, \b:词尾锚定;用于表示单词的模式的右侧;

wKiom1Xgc5_wwUoXAAIH_p-QJHk430.jpg

 ^$: 空白行;我们使用管道和wc -l 来统计匹配到的空白行 如下图:

wKiom1XgdEvzRK_6AAC5Yl7kU30453.jpg

 分组:\(\)
     分组的小括号中的模式匹配到的内容,会在执行过程中被正则表达式引擎记录下来,并保存内置的变量      中;这些变量分别是\1, \2, ...
   \1: 从左侧起,第一个左括号,以及与之配对的右括号中间的模式所匹配到的内容;
    \2: 从左侧起,第二个左括号,以及与之配对的右括号中间的模式所匹配到的内容;                    ...
    后向引用:使用变量引用前面的分组括号中的模式所匹配到的字符;

wKiom1Xgd-iRY3STAACkQAgAogQ023.jpg

   扩展的正则表达式:

         grep家庭有三个命令:
               grep:基本正则表达式
                -E: 扩展正则表达式
                -F:不支持正则表达式
                egrep:扩展正则表达式
                fgrep:不支持正则表达式

          扩展正则表达式的元字符

               字符匹配:
                   .: 任意单个字符
                   []:指定范围内的任意单个字符
                   [^]:不在指定范围内的任意单个字符
               次数匹配:

                  .*:匹配任意字符

                   *:匹配任意字符
                   ?:0次或1次;
                   +:1次以上;
                   {m}:精确匹配m次;
                   {m,n}:至少m次,至多n次;

                   {0,n}:至多n次,少了可以没有
                   {m,}:至少m次,多则不限

               位置锚定:
                   ^: 锚定行首
                   $: 锚定行尾
                   \<, \b:词首锚定;用于表示单词的模式的左侧;               

                   \>, \b:词尾锚定;用于表示单词的模式的右侧;

                   ^$: 空白行
               分组:()
                   后向引用:\1, \2, ...

以上扩展正则表达式和正则表达式使用方法差不多在这里就不一一截图了。

               或者:
                   a|b
                    C|cat: 不表示Cat或cat,而表示C或cat;
                    要写成(C|c)at



 说了那么多我们还是一起来做写练习吧!

 使用正则表达式和扩展表达式实现以下功能:

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

  答案如下图:                 

wKioL1XfKczDnI1YAADazMMQikc025.jpg

wKiom1XfJ7OhBRb3AAHjyoBHM80610.jpg

扩展表达式则是,如下图:

wKiom1XftCeS08frAADe5xAYK6U184.jpg

2、显示/etc/passwd文件中的两位数或三位数;如下图

wKioL1XfOP7gyR86AAQZCf066kI760.jpg

扩展表达式,如下图:

wKioL1XfzwThUmgxAAQPnuGV1Qo619.jpg

3、显示'netstat -tan'命令结果中以‘LISTEN’后跟0个、1个或多个空白字符结尾的行;如下图:

wKioL1XfpQ6yWVNSAAD1vSgZb4g037.jpg

扩展表达式 如下图:


wKiom1XgebbxYSf7AAMDuzqIeGI967.jpg

4、添加用户bash,testbash, basher以及nologin用户(nologin用户的shell为/sbin/nologin),并找出    shell和用户一样的用户

wKiom1Xjp26hfvONAAEb0C4Gmpw938.jpg

扩展表达式

wKioL1XjqiWxGvxtAAEU7yqtHBk675.jpg

使用扩展正则表达式实现以下功能

1、显示当前系统上root、centos或user1用户的默认的shell和UID;

wKiom1XjqUbR0wdXAAC3ecMxJL8807.jpg

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

wKiom1Xjr1KjA_4BAAHIfy2GdYY285.jpg

3、使用echo输出一个路径,而后egrep找出其路径基名;

wKioL1Xkc8vClrm6AABz3Bj7OZU038.jpg 进一步地:使用egrep取出其目录名;

wKioL1XkdCLQpAudAABksL1Sz30860.jpg  4、找出ifconfig命令执行结果中1-255之间的数字;

wKiom1XkcmzyV4-kAAJb8fgDzC0573.jpg