天天看点

grep与egrep用法从基础到高级进阶

一、grep

   国际音标[grep]

  grep是shell脚本中的文本搜索工具,根据用户指定的文本模式对目标文件进行逐行搜索,显示能被模式所匹配到的行。

   格式:

      grep [options] 'PATTERN' file,...

   常用选项:

      -v:反向匹配,显示不能被模式所匹配到的行。

      -o:仅显示被模式匹配到的字串,而非整行。

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

      -E:支持扩展正则表达式,Expand

      -A:显示匹配行及下一行,after

      -B:显示匹配行及上一行,befoe

      -C:显示匹配行及上下行

   grep基础用法很简单,直接命令+'PATTERN'+文件就好了

   例:找出/etc/passwd文件中所有与root有关的行。    

1

2

3

<code>[root@nmshuishui ~]</code><code># grep "root" /etc/passwd</code>

<code>root:x:0:0:root:</code><code>/root</code><code>:</code><code>/bin/bash</code>

<code>operator:x:11:0:operator:</code><code>/root</code><code>:</code><code>/sbin/nologin</code>

   要想实现grep的高级用法,须配合正则表达式及管道。那就先讲讲基本正则表达式。

二、基本正则表达式

   正则表达式就是一类字符所书写出的模式(pattern),来处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊称号的辅助,可以让用户轻易达到查找、删除、替换某特定字符串的处理程序。    

      元字符:不表示字符本身的意义,用于额外功能性的描述。

          1)字符匹配:

                  .:匹配任意单个字符

          2)次数匹配

                 * :匹配任意次         如:x*y: xxy  xy  y

                    .*:匹配任意长度的任意字符,0次或多次。

                 \?:匹配0次或1次       如:x\?y: xy  y  xxy  

                     xxy是匹配了x 2次,这也能行?当然,因为,grep有贪婪模式,尽可能长的去匹配字符。

                 \{m\}:匹配m次         这里的\代表转义字符,扩展正则表达式中不用

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

                 \{m,\}:匹配至少m次

                 \{0,n\}:匹配至多n次

           3)位置锚定: 用于指定字符出现的位置

                 ^:托字符,锚定行首   ^char

                 $:锚定行尾   char$

                 ^$:空白行  既是行首,又是行尾,当然就是空白行了

                 \&lt;:锚定词首   \&lt;char  \bchar     这里的\依然是转义

                 \&gt;:锚定词尾   char\&gt;  char\b    

                     \&lt;hello\&gt;:既锚定词首又锚定词尾,当然是锚定hello这个单词。

           4)分组

                 \(\)  \给括号转义

           5)引用

                 \1:前向引用,引用前面的第1个左括号以及与之对应的右括号中的模式所匹配到的内容                      \(a.b\)xy\1 --&gt; a6bxya6b

                 \2:前向引用,引用前面的第2个左括号以及与之对应的右括号中的模式所匹配到的内容

三、 小试牛刀:

  1)显示/etc/passwd中以r开头的行(锚定行首)

4

5

<code>[root@nmshuishui ~]</code><code># grep "^r" /etc/passwd</code>

<code>rpc:x:32:32:Rpcbind Daemon:</code><code>/var/cache/rpcbind</code><code>:</code><code>/sbin/nologin</code>

<code>rtkit:x:499:497:RealtimeKit:</code><code>/proc</code><code>:</code><code>/sbin/nologin</code>

<code>rpcuser:x:29:29:RPC Service User:</code><code>/var/lib/nfs</code><code>:</code><code>/sbin/nologin</code>

  2)显示/etc/passwd中以大小写S开头的行

6

<code>[root@nmshuishui ~]</code><code># grep "^[Ss]" /etc/passwd</code>

<code>sync</code><code>:x:5:0:</code><code>sync</code><code>:</code><code>/sbin</code><code>:</code><code>/bin/sync</code>

<code>shutdown</code><code>:x:6:0:</code><code>shutdown</code><code>:</code><code>/sbin</code><code>:</code><code>/sbin/shutdown</code>

<code>saslauth:x:498:76:</code><code>"Saslauthd user"</code><code>:</code><code>/var/empty/saslauth</code><code>:</code><code>/sbin/nologin</code>

<code>sshd:x:74:74:Privilege-separated SSH:</code><code>/var/empty/sshd</code><code>:</code><code>/sbin/nologin</code>

<code>shuishui:x:501:501::</code><code>/home/shuishui</code><code>:</code><code>/bin/bash</code>

  3)取出默认shell为bash的且其ID为最大的用户

<code>[root@nmshuishui ~]</code><code># grep "bash$" /etc/passwd |cut -d: -f1,3 -n|tail -1</code>

<code>user1:508</code>

  4)显示/etc/passwd中的一位数或两位数(锚定词首、记尾、分组、转义、次数匹配)

<a href="http://s3.51cto.com/wyfs02/M01/12/5F/wKiom1MEtQOQ7z-dAABLpGGVwvA012.png" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M00/12/5F/wKioL1MEtS2hM-S7AABW7p6IYPw535.png" target="_blank"></a>

 5)找出当前系统上用户名和默认shell相同的用户(行首、行尾锚定)

<a href="http://s3.51cto.com/wyfs02/M00/12/5F/wKiom1MEuPew7zRMAAAZ3gDAch4235.png" target="_blank"></a>

 6)grep配合其它命令的用法,找出本机的IP地址,只显示IP段(管道、cut)

<code>[root@nmshuishui ~]</code><code># ifconfig eth0 | grep "inet addr:" | cut -d: -f2 | cut -d' ' -f1</code>

<code>192.168.1.102</code>

四、egrep 扩展正则表达式

   上面提到过了,在扩展正则表达式中不需要转义符\

   元字符:

       1)字符匹配:

           .:任意单个字符

           []:指定范围内的任意单个字符

           [^]:指定范围外的任意单个字符

       2)次数匹配:

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

           ?:匹配其前面的字符0次或1次

           +:匹配其前面的字符1次或多次

          {m}:匹配其前面的字符m次

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

          {m,}:至少m次

          {0,n}:至多n次

        3)锚定:

           ^:锚定行首

           $:锚定行尾

           \&lt;:锚定词首    \b

           \&gt;:锚定词尾    \b

        4)分组:

          ():

           | :或者     基本正则表达式中没有|

        5)引用:

           \1:前向引用,引用前面的第1个左括号以及与之对应的右括号中的模式所匹配到的内容

           \2:前向引用,引用前面的第2个左括号以及与之对应的右括号中的模式所匹配到的内容

五、 扩展正则表达式练习

        1)找出ifconfig中1-255之间的整数。

<a href="http://s3.51cto.com/wyfs02/M00/12/73/wKioL1MHTSKDxzD1AAA-uGdoV7w700.png" target="_blank"></a>

本文转自 nmshuishui 51CTO博客,原文链接:http://blog.51cto.com/nmshuishui/1360856,如需转载请自行联系原作者