linux中的grep和egrep命令,Linux grep和egrep命令

在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

大家有没有发现,在这样匹配所需要内容时,信息虽然可以很方便的显示出来,但是有的时候,面对那些繁多的英文字母,我们需要的信息还是很难一下就被辨认出来;那怎么办呢?好,下面就说到grep的一个很有意思的选项了,那就是―color=auto,它的意思就是说让我们查找的内容以突出的颜色显示出来;

例如:

[root@station86 ~]# cgrep 'x' juli

xyz

x yz

x12yz

x2yz

x,yz

1xyz

xyz1

如果大家觉得每次用到的时候都要输入―color=auto很麻烦,我们也可以通过alias命令,来为―color=auto定义一个命令别名。假如我们为―color=auto定义的命令别名为cgrep,既alias cgrep=‘grep �color=auto’,那么,等我们需要查找内容时,直接输入cgrep [option]就可以用颜色突出我们所查找的内容了,注意,alias所定义的命令别名只在当前系统中生效哦。如果进程结束之后重新启动,需要重新定义命令别名才可以使用哦!

当然,grep的用法并不止上面提到的那么多,还有其他的一些其它的选项,这里就不详谈了,我们可以使用man grep命令,查看一下grep的其它选项。那接下来我们就说一下egrep的用法吧。

egrep

egrep其实是grep的扩充版本,支持扩展正则表达式,较之grep的基本正则表达式,元字符更加精简,不再需要反斜杠(\)转义,且增加了+,|等元字符,下面来看一下egrep都有哪些用法:

相当于grep -E

元字符

字符匹配:

egrep的字符匹配与grep的用法一样,我们就不详谈了,在这里,就说说它其它的选项。

次数匹配:

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

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

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

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

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

{0,n}:匹配其前面的字符至多n次

锚定:

^:用于锚定行首

$:用于锚定行尾

\

\>|\b:锚定词尾

分组:

():分组

|:或者。

匹配/etc/rc.d/rc.sysinit中以#开头,后面跟了至少一个空白字符,后面有至少一个非空白字符的行;

grep "^#[[:space:]]\{1,\}[^[:space:]]\{1,\}" /etc/rc.d/rc.sysinit

[root@station86 ~]# grep "^#[[:space:]]\{1,\}[^[:space:]]\{1,\}" /etc/rc.d/rc.sysinit

# /etc/rc.d/rc.sysinit - run once at boot time

# Taken in part from Miquel van Smoorenburg's bcheckrc.

# Check SELinux status

# Print a text banner.

# Only read this once.

# Initialize hardware

# Set default affinity

# Load other user-defined modules

# Load modules (for backward compatibility with VARs)

# Configure kernel parameters

从下面的例子可以看出,按照相同的搜索意向,egrep也可以实现对文本的搜索,而且,它相较于grep更便捷了,grep需要\转义的选项,egrep都是不需要的。

[root@station86 ~]# egrep "^#[[:space:]]{1,}[^[:space:]]{1,}" /etc/rc.d/rc.sysinit

# /etc/rc.d/rc.sysinit - run once at boot time

# Taken in part from Miquel van Smoorenburg's bcheckrc.

# Check SELinux status

# Print a text banner.

# Only read this once.

# Initialize hardware

# Set default affinity

# Load other user-defined modules

# Load modules (for backward compatibility with VARs)

# Configure kernel parameters

其它的用法,egrep和grep是很相像的。但是egrep比grep又多了+选项,用法和egrep其它次数匹配的选项是一样的,这里就不一一举例。

以上就是全部内容了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值