一、grep简介

   grep是一个强大的文本搜索工具,它能使用正则表达式搜索文件,并把匹配的行打印出来。Unix的家族包括grep、egrep、fgrep。

   grep:默认支持基本正则表达式

   egerp:扩展正则表达式

   fgrep:不支持正则表达式元字符,搜索字符串的速度快

二、grep用法

   grep [options] 'pattern' FILE

   选项:

   -v                    反向选取,只显示不符合模式的行

   -o                    只显示被模式匹配到字符串,而不是整行

   -i                    不区分字符大小写

   -A                    除了列出符合行之外,并且列出后N行

   -B                    除了列出符合行之外,并且列出前N行

   -C                    除了列出符合行之外,并且列出前后的N行

   -E                    使用扩展的正则表达式 grep -E = egrep

   --color=auto          高亮显示匹配到的行

三、正则表达式(见前一篇博客 http://mybsir.blog.51cto.com/4618614/1371362

四、正则匹配示例

   实验匹配文件 /etc/passwd

   1、匹配带有root的行

   grep 'root' /tmp/grep.txt

[root@myb362 ~]# grep 'root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

   2、匹配以root为首的行

   grep '^root' /etc/passwd

[root@myb362 ~]# grep '^root' /etc/passwd
root:x:0:0:root:/root:/bin/bash

   3、匹配以bash结尾的行

   grep 'bash$' /etc/passwd

[root@myb362 ~]# grep 'bash$' /etc/passwd
root:x:0:0:root:/root:/bin/bash

   4、匹配空白行

   grep '^$' /etc/fstab

[root@myb362 ~]# grep '^$' /etc/fstab
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
[root@myb362 ~]#

   5、匹配数字

   grep '[0-9]' /etc/passwd

[root@myb362 ~]# grep '[0-9]' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
...........

   6、匹配r后跟两个任意字符接着跟t的行

   grep 'r..t' /etc/passwd

[root@myb362 ~]# grep 'r..t' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

   7、匹配r后跟任意个字符接着跟t的行

   grep 'r.*t'    /etc/passwd

[root@myb362 ~]# grep 'r.*t' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
saslauth:x:499:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

说明:.表示任意个字符,*表示任意次数前一个字符,则.*表示任意次数个任意字符

8、匹配s后跟h或者y的行

   grep 's[h,y]' /etc/passwd

[root@myb362 ~]# grep 's[h,y]' /etc/passwd
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

   9、匹配s后不跟字母a到w之间字符的行

   grep 's[^a-w]' /etc/passwd

[root@myb362 ~]# grep 's[^a-w]' /etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
games:x:12:100:games:/usr/games:/sbin/nologin

   10、匹配sbin或者bin,即s出现0次或者1次

   grep 's\?bin' /etc/passwd = grep -E 's?bin' /etc/passwd = egrep 's?bin' /etc/passwd

[root@myb362 ~]# grep 's\?bin' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
.........

   11、匹配以bin为词首的行

   grep '\<bin' /etc/passwd

[root@myb362 ~]# grep '\<bin' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync

   12、匹配以bin为词尾的行

   grep 'bin\>' /etc/passwd

[root@myb362 ~]# grep 'bin\>' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
......

   13、匹配单词bin

   grep '\<bin\>' /etc/passwd

[root@myb362 ~]# grep '\<bin\>' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
......

   14、匹配r后有1个或者2个o的行

   grep 'ro\{1,2\}' /etc/passwd

[root@myb362 ~]# grep 'ro\{1,2\}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

   15、匹配root后跟任意多个字符之后再跟一个root的行

   grep 'root.*root' grep.txt

   16、匹配rt中间有任意两个字符后面跟和前一个模式一样的行,即如果前面一个模式为root,则后面那个也一定要是root,而不能是rbat或者其他模式

   首先创建一个文件grep.txt,内容为下:


rootrabt
rootroot
ROOT
Root

   grep '\(r..t\)\1' grep.txt


[root@myb362 ~]# grep '\(r..t\)\1' grep.txt
rootroot

   如果使用 grep 'r..tr..t' grep.txt的话,则两个都会匹配到

   grep 'r..tr..t' grep.txt

[root@myb362 ~]# grep 'r..tr..t' grep.txt
rootroot
rootrabt

   我们可以设置很多分组,\n表示引用第几个分组

   17、将匹配到的内容以高亮的形式显示

   grep --color=auto 'root' /etc/passwd    

   [root@myb362 ~]# grep --color=auto 'root' /etc/passwd

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

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

   18、反向选择匹配到的内容 grep -v

   ifconfig | grep 'inet' 显示匹配到IP地址的行

[root@myb362 ~]# ifconfig | grep 'inet'
          inet addr:192.168.144.129  Bcast:192.168.144.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fef9:649a/64 Scope:Link
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host

   ifconfig | grep 'inet'|grep '127.0.0.1'    正向显示匹配到的行

[root@myb362 ~]# ifconfig | grep 'inet' |grep '127.0.0.1'
          inet addr:127.0.0.1  Mask:255.0.0.0

   ifconfig | grep 'inet'|grep -v '127.0.0.1' 反向显示,即不显示匹配到的行

[root@myb362 ~]# ifconfig | grep 'inet' |grep -v '127.0.0.1'
          inet addr:192.168.144.129  Bcast:192.168.144.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fef9:649a/64 Scope:Link
          inet6 addr: ::1/128 Scope:Host

   19、忽略文件的大小写 grep -i

   grep -i 'root' grep.txt

[root@myb362 ~]# grep -i 'root' grep.txt
rootroot
rootrabt
ROOT
Root

   20、匹配root或者ROOT的行

   grep -E '(root)|(ROOT)' grep.txt

[root@myb362 ~]# grep -E '(root)|(ROOT)' grep.txt
rootroot
rootrabt
ROOT

以上为grep和egrep的基本用法。