在Linux中,grep是一个非常强大的文本搜索工具,它可以根据用户指定的文本搜索模式对目标文件进行逐行的搜索,然后将被模式匹配到的用户所需要的信息显示出来;
在Linux中,grep是一个非常强大的文本搜索工具,它可以根据用户指定的文本搜索模式对目标文件进行逐行的搜索,然后将被模式匹配到的用户所需要的信息显示出来;那么,egrep呢?从字母组合上看,二者很相像,那么事实上呢?下面我们就共同来看一下吧!
grep
grep全程是Global Regular Expression Print,意思是使用正则表达式搜索文本,并把匹配的行打印出来。如上所说,grep是一个非常强大的文本搜索工具,那么它到底是如何实现的呢?下面就来看看grep的具体用法。
格式
grep [option] 'PATTERN' file,.
[root@station86 ~]# grep 'root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
显示/etc/passwd中含有root的行
选项:
-v:反向匹配,既显示不能被模式匹配到的行;
[root@station86 ~]# grep -v 'root' /var/log/secure
Feb 17 14:30:52 station86 sshd[1716]: Received signal 15; terminating.
Feb 17 14:30:52 station86 sshd[1992]: Exiting on signal 15
Feb 17 14:31:56 station86 sshd[1814]: Server listening on 0.0.0.0 port 22.
由于内容较多,这里只贴出了一小段
-o:仅显示被模式匹配到的字串,而非整行;
[root@station86 ~]# grep -o 'root' /etc/passwd
root
root
root
root
-i:不区分字符大小写;
[root@station86 ~]# grep -i "^s" /proc/meminfo
SwapCached: 0 kB
SwapTotal: 2097144 kB
SwapFree: 2097144 kB
Shmem: 244 kB
Slab: 37348 kB
SReclaimable: 12140 kB
SUnreclaim: 25208 kB
显示行首为S|s的行;
-E:支持扩展的正则表达式
grep -E就相当于egrep,具体的实例我们会在下面讲到;
-A #:显示被模式匹配到的行及下面的#行;
[root@station86 ~]# grep -A1 'root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
--
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
-B #:显示被模式匹配到的及上面的#行;
[root@station86 ~]# grep -B1 'root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
--
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
-C #:上下各显示#行
[root@station86 ~]# grep -C1 'root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
--
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
除此之外,grep还可以配合正则表达式一起使用,正则表达式又被称为正规表示法、常规表示法。既然grep可以配合正则表达式一起使用,那么,正则表达式的主要参数有哪些呢?
元字符
字符匹配:
.:匹配任意单个字符
[]:指定范围内的任意单个字符
[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:说明char必须出现在行首
$:用于锚定行尾
char$:一定以这个字符结尾的
^$:查找一个文件中所出现的空白行
\
char\>:锚定词尾,char\b
\b:可以代表词首词尾的符号
分组元字符:
\(\):一个字符串可以出现的次数
\(ab\)*:即行中ab可以出现的次数
引用:
\1:后向引用,引用前面的第一个左括号以及与之对应的右括号中的模式所匹配到的内容
\2:
\3:...
\(a.b\)xy\1:a6bxya6b,既是引用第一对括号内所匹配的内容,即括号内为a6b,那么\1引用的也是a6b,和括号内的内容完全一样
[root@station86 ~]# grep ^user.*bash$ /etc/passwd
user2:x:505:505::/home/user2:/bin/bash
user10:x:506:506::/home/user10:/bin/bash
user4:x:507:507::/home/user4:/bin/bash
user5:x:508:508::/home/myuser:/bin/bash
user6:x:509:509:备注:/home/user6:/bin/bash
匹配/etc/passwd中行首为user行尾为bash,中间跟了任意次数任意字符的行
创建一个文本文件juli,里面内容如下:
xyz
x yz
x12yz
x2yz
x,yz
Xyz
XYZ
1xyz
xyz1
匹配juli中行首为数字的行
[root@station86 ~]# grep ^[0-9] juli
1xyz
匹配juli中行首为数字的行,和第一个例子效果一样,只是表达式不同
[root@station86 ~]# grep ^[[:digit:]] juli
1xyz
匹配juli中行首为小写字母,后面跟了任意次数的任意字符的行
[root@station86 ~]# grep ^[[:lower:]].* juli
xyz
x yz
x12yz
x2yz
x,yz
xyz
匹配juli中以yz结尾,x可有可无的行
[root@station86 ~]# grep 'x\?yz' juli
xyz
x yz
x12yz
x2yz
x,yz
Xyz
1xyz
xyz1
匹配juli中以x开头以z结尾的行
[root@station86 ~]# grep '\' juli
xyz
匹配juli中x和yz中间有一个空格符的行
[root@station86 ~]# grep 'x[[:space:]]yz' juli
x yz