一、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的基本用法。