grep:根据模式,搜索文本,将匹配的行显示出来

    语法:grep [OPTIONS] PATTERN [FILE...]

    PATTERN:将文本字符和正则表达式的元字符组合成的匹配条件

            如: grep 'root' /etc/passwd,查找出文件中包含'root'字符的行。

    OPTIONS:

        --color:将匹配到的串用高亮颜色显示出来 

            如: grep --color 'root' /etc/passwd 

            另:alias grep='grep --color',可定义为别名   

        -i, --ignore-case

            Ignore case distinctions in both the PATTERN and the input files.

            忽略模式匹配大小写

如:                

[root@station01 ~]# grep -i 'Root' /etc/passwd
root:$6$yA.3HL1hnKwnfKxO$3Z05q4552ogFjS.LtwgL03d//Svp.Aoud/4GbN8ny/XZEvhv/WxTBtV9mmf5zirQWtblMuufvaxDDz8Tr1ABo1:0:0:root:/root:/bin/bash
operator:*:11:0:operator:/root:/sbin/nologin

        -v:显示没有被模式匹配到的行 

        -o:只显示被模式匹配到的字符串,并且每个串显示为一行

       -E:扩展正则表达式

       -A NUM:显示匹配到行的后NUM行,即After

[root@station01 ~]# grep --color -A 3 'cpu MHz' /proc/cpuinfo   
cpu MHz         : 2128.040
cache size      : 4096 KB
fdiv_bug        : no
hlt_bug         : no

       -B NUM:显示匹配到行的前NUM行,即Before

[root@station01 ~]# grep --color -B 3 'cpu MHz' /proc/cpuinfo  
model           : 26
model name      : Intel(R) Xeon(R) CPU           E5506  @ 2.13GHz
stepping        : 5
cpu MHz         : 2128.040

       -C NUM:显示匹配到行的前后NUM行,即Context

[root@station01 ~]# grep --color -C 3 'cpu MHz' /proc/cpuinfo  
model           : 26
model name      : Intel(R) Xeon(R) CPU           E5506  @ 2.13GHz
stepping        : 5
cpu MHz         : 2128.040
cache size      : 4096 KB
fdiv_bug        : no
hlt_bug         : no


如:

[root@station01 ~]# grep -o 'root' /etc/passwd           
root
root
root
root

通配字符:

    

globbing:

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

    ?:任意单个字符

    []:指定范围内的字符

    [^]:指定范围外的字符

正则表达式:Regular Expression ,REGEXP,由不表示字符本身意义的元字符组成


元字符:

    .:匹配任意单个字符

如:查找以r开头t结尾中间是任意两个字符的字符串

[root@station01 ~]# grep --color 'r..t' /etc/passwd 
root:$6$yA.3HL1hnKwnfKxO$3Z05q4552ogFjS.LtwgL03d//Svp.Aoud/4GbN8ny/XZEvhv/WxTBtV9mmf5zirQWtblMuufvaxDDz8Tr1ABo1:0:0:root:/root:/bin/bash
operator:*:11:0:operator:/root:/sbin/nologin
ftp:*:14:50:FTP User:/var/ftp:/sbin/nologin

    *:表示匹配其前面的字符任意次数,即0到无穷次

如:

    test2.txt文件中的内容如下:

a
b
ab
aab
aaab
acb
addb
amnb


结果:

[root@station01 ~]# grep --color "a*b" ./test2.txt 
b
ab
aab
aaab
acb
addb
amnb


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

如:

结果:

[root@station01 ~]# grep --color "a.*b" ./test2.txt 
ab
aab
aaab
acb
addb
amnb



默认情况下正则表达式工作在贪婪模式下,即尺可能多的匹配


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

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

 [:alnum:]所有字符, [:alpha:]所有字母, [:cntrl:], [:digit:]所有数字, [:graph:], [:lower:]小写字母, [:print:],

 [:punct:]符号, [:space:]空白字符, [:upper:]大写字母, [:xdigit:]

如:test2.txt文件

[root@station01 ~]# cat test2.txt 
a
b
ab
aab
aaab
acb
addb
amnb
ambbmnbaaafbaaabadffb

执行结果:

[root@station01 ~]# grep --color "a.*b" ./test2.txt 
ab
aab
aaab
acb
addb
amnb
ambbmnbaaafbaaabadffb


正常应该匹配到第一个amb即可

    \?:匹配其前字符0次或1次,注意模式中?号防需要转义,即\?

如:

结果:

[root@station01 ~]# grep --color "a\?b" ./test2.txt 
b
ab
aab
aaab
acb
addb
amnb
ambbmnbaaafbaaabadffb


整个串中有部分匹配

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

如:

    \{1,\}:至少1次

    \{,5\}:至多5次

查找a至少出现1次,至多3次,结尾是b的字符串

结果:

[root@station01 ~]# grep --color "a\{1,3\}b" ./test2.txt  
ab
aab
aaab
ambbmnbaaafbaaabadffb

查找a开头b结尾,中间出现至少1个最多3个的任意字符

[root@station01 ~]# grep --color "a.\{1,3\}b" ./test2.txt  
aab
aaab
acb
addb
amnb
ambbmnbaaafbaaabadffb



位置锚定

    ^:行首锚定,此字符后的任意字符出现在行首

查找/etc/passwd文件中以r开头,以t结尾,中间出现任意两个字符的字符串,且出现在行首

结果:

[root@station01 ~]# grep --color '^r..t' /etc/passwd
root:$6$yA.3HL1hnKwnfKxO$3Z05q4552ogFjS.LtwgL03d//Svp.Aoud/4GbN8ny/XZEvhv/WxTBtV9mmf5zirQWtblMuufvaxDDz8Tr1ABo1:0:0:root:/root:/bin/bash

    $:行尾锚定,此字符前的内容必须出现在行尾

查找/etc/inittab中以w结束的行

结果:

[root@station01 ~]# grep --color 'w$' /etc/inittab 
# For information on how to write upstart event handlers, or how


    ^$:空白行

查找/etc/inittab中的空白行

[root@station01 ~]# grep  '^$' /etc/inittab |wc -l
2

查找以数字结尾的行

[root@station01 ~]# grep --color '[[:digit:]]$' /etc/inittab 
#   5 - X11


    单词锚定

    \<:其后面的字符必须作为单词的首部出现,也可\b

    \>:其前的字符必须作为单词的尾部出现,也可\b

    \<root\<:root必须作为一行的单词出现,也可\broot\b


如文件test3.txt文件内容如下:

[root@station01 ~]# cat test3.txt 
root is administrator.
admin is a rooter.
adminrooter is wrong.
he is heroot

查找root出现在词首的行

结果:

[root@station01 ~]# grep --color '\<root' test3.txt 
root is administrator.
admin is a rooter.

查找root出现在词尾的行

结果:

[root@station01 ~]# grep --color 'root\>' test3.txt   
root is administrator.
he is heroot


查找以一个单词出现的行

结果:

[root@station01 ~]# grep --color '\<root\>' test3.txt 
root is administrator.
[root@station01 ~]# grep --color '\broot\b' test3.txt 
root is administrator.


    分组

    \(\):将一串字符看成一个整体

查找以ab为一个整体出现的行

文件内容如下:

[root@station01 ~]# cat test2.txt 
a
b
ab
aab
aaab
acb
addb
amnb
ambbmnbaaafbaaabadffb

执行结果:

[root@station01 ~]# grep --color '\(ab\)*' test2.txt 
a
b
ab
aab
aaab
acb
addb
amnb
ambbmnbaaafbaaabadffb

    后向引用:前面出现的字符串,后面引用

    \1:引用第一个左括号和第一个右括号所包括的内容

    \2:同上,只不过是第二个

    \3:同上,只不过是第三个

测试文件内容如下:

[root@station01 ~]# cat test4.txt 
he like his lover
she love her liker
he like his liker
she love her lover

执行结果:

查找以l开头,e结尾,中间跟两个任意字符的行

[root@station01 ~]# grep --color 'l..e' test4.txt 
he like his lover
she love her liker
he like his liker
she love her lover

查找以l..e开头并以l..e结尾中间跟任意个字符的行

[root@station01 ~]# grep --color '\(l..e\).*\1' test4.txt 
he like his liker
she love her lover

查找/etc/inittab中前面是任意数字,并以此数字结尾的行

[root@station01 ~]# grep --color '\([0-9]\).*\1$' /etc/inittab 
#   5 - X11



2015年2月16日于银川

GB-2312