grep的命令格式:

    grep [OPTION]... PATTERN [FILE]...

    根据指定的pattern搜索FILE,并显示匹配的行。

    grep默认使用基本正则表达式。


OPTIONS:

    正则表达式选择:

        -E,--extend-regexp:  pattern使用扩展正则表达式(ERE0

        -F,--fixed-strings:  pattern使用固定字符串

        -G,--basic-regexp:  pattern使用基本正则表达式(BRE)

        -P,--perl-regexp:   pattern使用Perl正则表达式

        -e,--regexp=PATTERN: 使用PATTERN匹配

        -f,--file=FILE:     从文件中读取PATTERN

        -i,--ignore-case:   忽略匹配的大小写

        -w,--word-regexp:   强制pattern仅匹配整个单词(words)

        -x,--line-regexp:   强制pattern仅茶杯整行(lines)

        -z,--null-data:  

  

    混杂选项:

        -s,--no-messages:   抑制错误消息输出

        -v,--invert-match: 打印不匹配的行

        -V,--version:      打印版本信息


    输出控制选项:

        -m,--max-count=NUM:   在匹配到NUM次后停止

        -n,--line-number:     打印输出行的行号

        -H,--with-filename:   打印每一个匹配的文件名

        -h,--no-filename:     抑制打印匹配的文件名

        -o,--only-matching:   仅打印匹配的PATTERN

        -q,--quiet,--silent:  抑制所有的正常打印输出

        -r,-R,--recursive:    同-d,--directories=ACTION操作目录

            --include=FILE_PATTERN:    搜索匹配FILE_PATTERN的文件

            --exclude=FILE_PATTERN:    不搜索匹配FILE_PATTERN的文件

            --exclude-from=FILE:       不搜索匹配FILE的文件

            --exclude-dir=PATTERN:     不搜索匹配PATTERN的目录

        -L,--file-without-match:       打印匹配pattern的文件名

        -l,--file-with-match:          打印不匹配pattern的文件名

        -c,--count:                    打印匹配行的行数

        -T,--initial-tab:              与-H,-n,-b结合使用,在文件名之后打印一个Tab

        

    上下文件控制选项:

        -B,--before-context=NUM:        打印匹配行的上面NUM行

        -A,--after-context=NUM:         打印匹配行的下面NUM行

        -C,--context=NUM:               打印匹配行的上和下各NUM行

        -NUM:                           和--context=NUM功能一样

        --color=auto                    高亮显示匹配的pattern的色彩


PATTERN:

    使用正则表达式书写的字符,分为:基本正则表达式(BRE)和扩展正则表达式(ERE)。

BRE:

    字符匹配:

        .:    任意单个字符


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

            [0-9],[[:digit:]]:    数字

            [a-z],[[:lower:]]:    小写字母

            [A-Z],[[:upper:]]:    大写字母

            [[:alpha:]]:          字母

            [[:alnum:]]:          字母和数字

            [[:space:]]:          空格

            [[:punct:]]:         特殊符号


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


        次数匹配:    用来指定匹配其前面的字符的次数

            *:    任意次

            \?:    0次或1次

            \{m\}:    匹配m次

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

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

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


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

            ^:    行首

            $:    行尾

            ^$:   空行

            \<char,\bchar:    char词首

            char\>,\bchar:    char词尾


        分组:

            \(\)

        

        引用:

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

            \2:    

            ...

            \n:


ERE:

    字符匹配:

        .:    任意单个字符


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

            [0-9],[[:digit:]]:    数字

            [a-z],[[:lower:]]:    小写字母

            [A-Z],[[:upper:]]:    大写字母

            [[:alpha:]]:          字母

            [[:alnum:]]:          字母和数字

            [[:space:]]:          空格

            [[:punct:]]:         特殊符号


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

    

    次数匹配:

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

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

        +:     匹配其前面的字符至少1次

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

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

        {m,}:  匹配至少m次

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


    位置锚定:

        ^:    行首

        $:    行尾

        \<char,\bchar:    词首

        char\>,\bchar:    词尾

    

    分组:

        ():    分组

         |:      或者



egrep:

        相当于grep -E


fgrep:

        相当于grep -F



grep使用举例说明:

  1. 查找文件/etc/fstab中以大写字母开头的行

    #grep '^[[:upper:]]' /etc/fstab 

    UUID=a14e6fe1-5cea-4436-9159-92a98d6438ab /boot         ext4    defaults        1 2

  2. 查找文件/etc/fstab中以小写字母开头的行

    #grep -v '^[[:upper:]]' /etc/fstab

    #grep '^[[:lower:]]' /etc/fstab


    # /etc/fstab

    # Created by anaconda on Tue Feb 11 13:32:36 2014

    #

    # Accessible filesystems, by reference, are maintained under '/dev/disk'

    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

    #

    /dev/mapper/VolGroup-lv_root /                       ext4    defaults        1 1

    /dev/mapper/VolGroup-lv_home /home                   ext4    defaults        1 2

    /dev/mapper/VolGroup-lv_swap swap                    swap    defaults        0 0

    tmpfs                   /dev/shm                tmpfs   defaults        0 0

    devpts                  /dev/pts                devpts  gid=5,mode=620  0 0

    sysfs                   /sys                    sysfs   defaults        0 0

    proc                    /proc                   proc    defaults        0 0


3. 在文件/etc/fstab中查找vol,忽略大小写,并显示行号

    #grep -n -i "vol" /etc/fstab  

    7:/dev/mapper/VolGroup-lv_root /                       ext4    defaults        1 1

    9:/dev/mapper/VolGroup-lv_home /home                   ext4    defaults        1 2

    10:/dev/mapper/VolGroup-lv_swap swap                    swap    defaults        0 0


4. 查找文件/etc/fstab中前两次匹配的vol,忽略大小写。

    #grep -m 2 -i "vol" /etc/fstab

    7:/dev/mapper/VolGroup-lv_root /                       ext4    defaults        1 1

    9:/dev/mapper/VolGroup-lv_home /home                   ext4    defaults        1 2


5. 查找文件/etc/passwd和文件/etc/shadow中包含root的行,并显示匹配模式的文件名,格式化文件名输出

    #grep -T -H "root" /etc/{passwd,shadow}  

/etc/passwd    :root:x:0:0:root:/root:/bin/bash

/etc/passwd    :operator:x:11:0:operator:/root:/sbin/nologin

/etc/shadow    :root:$6$Oa/pUB99$DgENZ9brWCyUUDHS.Ed.qrky69EuYx6.Dgi0:16290:0:99999:7:::

        

6. 抑制错误消息输出

   #grep -T -H "root" /etc/{password,shadow}   

   由于不存在/etc/password这个文件,所以会显示:

   grep: /etc/password: No such file or directory 

   加上-s选项可以抵制错误信息输出

   #grep -s -T -H "root" /etc/{password,shadow}   


7. 在/etc/passwd文件中,以彩色显示匹配的以root开头的行

   #grep --color=auto -o "^root\b" /etc/passwd


8. 在/etc/passwd文件中,显示匹配单词root的行数

   #grep -c "root" /etc/passwd

    2


9. 在文件/etc/passwd /etc/shadow /etc/fstab中显示以单词root开头的文件名

  #grep  -l "^root" /etc/{passwd,shadow,fstab}   

    /etc/passwd

    /etc/shadow


10. 在文件/etc/passwd /etc/shadow /etc/fstab中显示不以单词root开头的文件名

    #grep  -L "^root" /etc/{passwd,shadow,fstab}   

    /etc/fstab


11. 在目录python下查找以py结尾的文件,显示包含import的行以及行号

    #grep -rn --include=*.py import python   

    python/telnet.py:1:import getpass

    python/telnet.py:2:import sys

    python/telnet.py:3:import telnetlib

    python/tool.py:1:import getpass

    python/tool.py:2:import sys

    python/tool.py:3:import telnetlib


12. 显示网卡信息ifconfig eth0中包含点分十进制格式x.x.x.x的行

    #ifconfig eth0 | grep '[[:digit:]]\

    

13. 查找文件/boot/grub/grub.conf中至少一个空白字符开头的行

    #grep '^[[:space:]]\{1,\}.*' /boot/grub/grub.conf

    #grep -E '^[[:space:]]{1,}.*' /boot/grub/grub.conf      

        root (hd0,0)

        kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 rd_LVM_LV=VolGroup/lv_root  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet

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


14. 查找当前系统中用户名与默认shell相同的用户

    #grep '^\([[:alnum:]]\{1,\}\)\>.*\1$' /etc/passwd


15. 找出/etc/passwd文件中一位数或两位数

    #grep --color=auto '\b[0-9]\{1,2\}\b' /etc/passwd


16. 写一个模式,能匹配真正意义上的IP地址;(1.0.0.1--223.255.255.254)

    #ifconfig eth0 | grep -E --color=auto '\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-1][0-9]|22[0-3])\>\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>'

    简写形式:

    #ifconfig eth0 | grep -E --color=auto '\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-1][0-9]|22[0-3])\>\.(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.){2}\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>'

    inet addr:116.247.73.198  Bcast:116.247.73.207  Mask:255.255.255.240