探索:Linux中强大的文本搜索命令----grep

这两天在看日志管理相关的资料,接触过日志的同学都知道,日志内容纷繁复杂,为了排查bug,后台总是尽可能地打印所有与代码运行有关的信息,看起来头疼,但是通过一个强大的文本搜索命令,完美的解决了我的疑惑,这条命令即-grep(Global regular expression print),表示全局正则表达式打印。

grep命令用于查找文件里符合条件的字符串,使用语法如下:
grep [-acinv] [--color=auto] '要查找的字符串' filename

我们通过实操演示环节来学习grep的各种用法,首先将/etc下的文件man.conf复制到/var下方便操作,先来看下该文件的大体结构。
在这里插入图片描述
这是其中的一部分内容。
稍微关注一下就可以发现,文本内容中出现最多的字符是含man的语句(包含大小写以及截取段),所以接下来主要以man作为要查找的字符进行演示。

第一条命令是统计man.conf文件中字符man出现的次数,可以看到统计结果为:62。

[192:var apple$ grep -o man man.conf | wc -l
​      62

语法:grep -o 被统计的字符 统计文件主体 | wc -l

第二条命令开始简单统计字符man在文件中出现的行:

[192:var apple$ grep [-n] 'man' man.conf 

上述命令中-n是可选,熟悉基本命令的同学都知道-n是显示行数,结果如下(为了不占用篇幅,省去大部分结果,可以看到加了-n之后每行开头加了行数进行提示):

2:# Generated automatically from man.conf.in by the
5:# man.conf from man-1.6g
7:# For more information about this file, see the man pages man(1)
...
...
96:JNROFF    /usr/bin/groff -Tnippon -mandocj -c
...
...
129:# Note that some systems have /usr/man/allman, causing pages to be shown twice.
134:# The command given must act as a filter

接下来解释部分实用的参数:

-c:仅输出匹配行的计数
-i:不区分大小写
-h:查询多文件时不显示文件名
-l:查询多文件时只输出包含匹配字符的文件名
-n:显示匹配行及行号
-s:不显示不存在或无匹配文本的错误信息
-v:显示不包含匹配文本的所有行
--color=auto :可以将找到的关键词部分加上颜色的显示

上述命令是可以一起执行的:

[192:var apple$ grep -ci 'man' man.conf 
58
#打印不区分大小写含man字符的行数总和

注意:使用grep查找字符时,被查找的字符可以使用单引号,也可以不使用
grep还可以查找多个文件的字符;

#先将man.conf文件复制一份命名为woman.txt
[192:var apple$ sudo cp man.conf /var/woman.txt

在两个文件中查找man字符:篇幅有限,只显示总行数

[192:var apple$ grep -ic man man.conf woman.txt 
 man.conf:58
 woman.txt:58
 #可以看到经过复制的文本,各有58行

语法:

grep [options] 被统计的字符 文本1 文本2 文本3 ...

一般在批量日志查询的时候,文件名的前缀或者后缀都是相同的,这样就可以使用正则:
复制man.conf为women.conf
在这里插入图片描述
查找当前路径中以conf结尾的文件中man的行数:

[192:var apple$ grep -ic man *.conf
man.conf:58
woman.conf:58

查找当前路径以wom开始的文件中man的行数:

[192:var apple$ grep -ic man wom*
woman.conf:58
woman.txt:58

不仅文件名可以正则表示,要查找的字符串同样可以正则:查找文件中m*n的行数:

[192:var apple$ grep -ic m*n wom*
woman.conf:99
woman.txt:99
#查找当前目录中以wom开头的文件中包含m*n字符的行数

对于字符的正则常在日志中查找固定时间段的日志中非常便捷如:

#查找2020年4月的最后10天的日志内容
grep -n '2020-04-2* 00:01:11' *.log

前面各个例子是查找并打印出符合条件的行,通过"-v"参数可以打印出不符合条件行的内容,篇幅限制还是只统计行数:

[192:var apple$ grep -vc m*n wom*
woman.conf:50
woman.txt:50

注意,在正则表达式中:

. 代表绝对有一个字符的意思

* 代表重复前一个字符0到无穷多次的意思,为组合形态

最后是关于颜色的显示:

[appledeair-5:var apple$ grep --color=auto man man.conf 

在这里插入图片描述
关于grep的使用,正则表达式的灵活应用必不可少,比如:

grep -n 'm[ae]n' man.conf
#在man.conf中查找man或者men字符串所在的行
grep -n '[^wo]man' man.conf
#在man.conf中查找前面没有wo字符的man字符串所在的行
grep -n [0-9] man.conf
#在man.conf中查找里面含有数字的行
grep -n '^[A-Z]' man.conf
#在man.conf中查找开头是大写字母的行
grep -n ^[^a-zA-Z] man.conf
#在man.conf中查找开头不是字母的行

目前为止,关于grep的简单总结将告一段落,其实这只是grep强大作用的冰山一角,但是已经可以涵盖平时工作学习的百分之八十,有兴趣可以接着探索。

如果觉得本文写的还不错的伙伴,可以给个关注一起交流进步,如果有在找工作且对阿里感兴趣的伙伴,也可以发简历给我进行内推:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值