一 、 grep及egrep的基本介绍:

首先我们要知道grep的这个命令的本身意思即:

  grep [Global search REgular expression and Print out the line ]  全局搜索正则表达式匹配到的内容,并且打印出匹配内容所在行

     grep 是一个很常用但是也很强大的搜索工具,它是以正则表达式为基础,搜索文本文件中符合要求的字符串,并且显示所匹配的字符串所在行。

grep搜索的内容是以一行来显示的,当然我们可以使用一些特别的选项来只显示我们所匹配到的内容,这个稍后会为你讲解到,grep一般会与(|)管道

像结合使用,grep+基本正则表达式+管道 则是我们在实际操作中用到最多的组合。

二、  grep 命令的使用方法

使用语法格式: 

       grep [OPTIONS] PATTERN [FILE...]

        -c:只输出匹配行的计数。

-i:不区分大 小写(只适用于单字符)。

-h:查询多文件时不显示文件名。

        -e: 即egrep,配合扩展正则表达式使用和grep同样的用法

-l:查询多文件时只输出包含匹配字符的文件名。

-n:显示匹配行及 行号。

-s:不显示不存在或无匹配文本的错误信息。

-v:反向选取,显示不包含匹配文本的所有行

-o:仅显示匹配的字串,而非字串所在的行

 -A +#:显示匹配行后#行

 -B +#:显示匹配行前#行

 -C +#:显示匹配行前后各#行

     egrep = grep -e 用法与grep相同,配合扩展正则表达式使用,打印出匹配到的字符串。我们前面一直在说grep或egrep 配合正则表达式使用,那么什么是正则表达式呢?下面为你介绍,linux入门很重要的知识,正则表达式

三、正则表示 RE[Regular Expression]

 正则表示基础概念

是一类字符所书写的模式,使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。其中许多字符不表示其字面意义,而是表达控制或通配等功能,简明的说,正则表达式就是使用一些字符组合成的规则,来配合搜索命令让用户方便快捷的完成目的。

正则表示分 基础正则表达式 与 扩展正则表达式 两种类型。

一)基本正则表达式:

基本正则表达式通常使用的元字符如下:

1、 字符匹配

        . :    表示任意单个字符

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

           [0-9]     匹配0-9内的任意单个数字同[[:digit:]]

              [a-z]匹配a-z内的任意单个字母同[[:lower:]]

      [A-Z]与[a-z]类似   同[[:upper:]]

[[:space:]]     匹配空格

        [[:digit:]]匹配任意单个数字

[[:lower:]]匹配任意单个小写字母

[[:upper:]]匹配任意单个大写字母

[[:punct:]]匹配任意单个字符

[[:alpha:]]匹配任意单个字母

[[:alnum:]]匹配任意单个字母或数字

 2、 次数匹配元字符,用于指定其前面的字符出现的次数

* : 表示任意长度,他前面的字符可以出现任意次

 \? : 表示0次或1次,它前面的字符可有可无

例如:x\?y 有以下可能:

    y 或者 xy

\{m\}: m次,它前的字符要出现m次

  例如:x\{2\}y 

可能为: xy, xxy, y, xxxxy, xyy

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

          例如:x\{2,5\}y

        可能为: xy, y, xxy

        \{m,\}:至少m次

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

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

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

[root@localhost ~]# grep "^[[:space:]]\{1,\}" /boot/grub/grub.conf

root (hd0,0)

kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=/dev/mapper/vg0-root rd_NO_LUKS rd_NO_DM LANG=en_US.UTF-8 rd_LVM_LV=vg0/swap rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg0/root  KEYBOARDTYPE=pc KEYTABLE=us rhgb crashkernel=auto quiet rhgb quiet

initrd /initramfs-2.6.32-431.el6.x86_64.img

3、 位置锚定元字符,用于指定匹配字符所在行的具体位置

            ^: 行首锚定;

后跟的字符出现在行首

    例如:搜索/etc/passwd 文件内以a开头的行

[root@localhost ~]# grep --color=auto "^a" /etc/passwd

adm:x:3:4:adm:/var/adm:/sbin/nologin

avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin

        abrt:x:173:173::/etc/abrt:/sbin/nologin

apache:x:48:48:Apache:/var/www:/sbin/nologin

            $: 行尾锚定:

        后跟的字符出现在行尾

    例如: 搜索/etc/passwd 文件内以bash结尾的行(由于内容太多,我只列出几行做示例)

[root@localhost ~]#grep "\bbash\b$" /etc/passwd

x1:x:3320:3320::/home/x1:/bin/bash

x2:x:3321:3321::/home/x2:/bin/bash

mmm1:x:3322:3322::/home/mmm1:/bin/bash

mmm2:x:3323:3323::/home/mmm2:/bin/bash

不包含特殊字符的连续字符组成的串叫单词:

\<或\b: 词首,出现于单词左侧,

>或\b: 词尾,出现于单词右侧

 ^$: 表示空白行

4、分组和引用

分组:

\(\):把小括号内的内容当做单个字符来使用

引用:

\#: 引用第n个括号所匹配到的内容,而非模式本身。

例如: \(xyz\).*\1 = xyz.*xyz

二) 扩展正则表达式

扩展正则表达式主要是指 egrep fgrep 及几个相关的特殊元字符

特殊元字符

+  表示它前面的字符至少出现一次。

?  表示0个或1一个字符,与基本正则表达式里的\?不同,请注意

|  用或的方式选择|两边的字符。

        ()  用户组字符串,就是把元字符内的看做是一个组一个整体。

四、举2个grep + 正则表达式的结合使用示例:

(1)显示当前系统上root、fedora或user1用户的信息;

[root@localhost ~]#egrep "^(root|fedora|user1):" /etc/passwd 

root:x:0:0:root:/root:/bin/bash

    本例题,用到行首锚定^和扩展正则表达式中的"|",所以要用egrep,由于我的系统上每添加fedora和user1用户,故只显示root的信息。

(2)使用echo命令输出一个路径,而后使用grep取出其基名

[root@localhost ~]#echo "/etc/passwd/" | grep -o -E "[[:alnum:]]+/?$"

passwd/

    这个例题中,用到了grep ,管道,以及扩展正则表达式,可以说是以后最常用到的模式,来处理教复杂点的问题,同时也用到了正则表达式的各种元字符。