grep搜索查找命令

grep命令是Linux系统中一个强大的文本搜索工具。根据个人鄙陋的一点经验来说,这是一个程序员在Linux系统最常用的几个命令之一。举个使用频率能和其并驾齐驱的命令,比如:cd。grep就像程咬金的“三板斧”,在debug时,抡起grep,再顽固的bug也会无所遁形的。

常用参数

执行 man grep 可以看到grep有非常多的参数。下面介绍一下,一些个人感觉比较常用的。

短参数长参数说明速记
--color[=WHEN]输出文本的颜色控制,when有三个值:never:不着色, always:全部着色,auto:着色
-l--files-without-match只输出匹配内容所在的文件名
-L--files-with-matches只输出未匹配内容所在的文件名
-H--with-filename显示匹配的文件名,有多个文件时,该配置默认开启
-h--no-filename不显示匹配的文件名
-n--line-number显示匹配文本的行数n是line number,就是行号
-A NUM--after-context=NUM显示匹配文本后面的NUM行A是after,后面
-B NUM--before-context=NUM显示匹配文本前面的NUM行B是before context,前面
-C NUM,-NUM--context=NUM显示匹配文本前后的NUM行C是context,上下文
-i--ignore-case忽略大小写i是ignore-case,是小写的i哈
-r--recursive递归匹配目录下的所有文件

使用场景举例

color参数

如果grep的默认配置没有对匹配文本进行着色。则我们可以使用--color=auto参数进行配置,则会对已经匹配的文本进行着色。
但当我们使用管道命令,进行多次grep过滤时,--color=auto是只对最后一次匹配进行着色的。如果我们想把所有的匹配都进行着色,那我们就可以使用--color=always进行设置,样例如下:

# 无颜色
echo "这是颜色测试,红色,蓝色" |grep "红色"
# “红色”被着色
echo "这是颜色测试,红色,蓝色" |grep "红色" --color=auto
# 都没有颜色
echo "这是颜色测试,红色,蓝色" |grep "红色" --color=auto|grep "蓝色"
# “红色”和“蓝色”都被着色
echo "这是颜色测试,红色,蓝色" |grep "红色" --color=always|grep "蓝色" --color=always

只输出匹配内容的文件名

如果拿到匹配内容的文件名,然后再对文件进行处理,则可以使用-l参数。比如想找到符合条件的文件内容的。

日常的进程查看

日常系统运维监控的时候,我们想看看某个进程是否查看。如果想查看是否有java进程,可以执行如下命令:

ps aux|grep java
# 当然这里也可以用jps

进程的杀死

比如我们重启程序的时候,总需要先判断程序在不在。假设系统有很多个java程序,我们多次进行过滤,然后结合xargs和awk命令进行进程杀死。命令如下:

ps aux|grep java|grep com.shuanghu.App|awk '{print $2}'|xargs kill

awk '{print $2}'表示按空格分割,取第二列,正好是进程号。

查看网络端口号

查看当前系统侦听的所有端口号。命令如下:

netstat -ano|grep LISTEN

debug查看日志

在程序的调试过程中,查看日志,是debug的第一步。如果在日志文件里快速找到需要的日志呢。如果是java语言,则可以使用grep Exception在日志文件里快速定位日志发生的位置。默认grep只显示一行是远远不够的。我们还需要了解bug发生时的上下文,则可以使用grep Exception -C 10查看上下10行的日志。命令如下:

grep Exception -C 10

debug查看动态日志

tail命令是Linux系统提供的一个文件查看命令。tail命令支持-f参数,能够滚动查看文件最新的变化内容。但tail -f只是把文件所有变化内容动态输出。太多的日志,我们是无法进行debug的。那这个时候,grep就能大显身手。我们可以通过管道和grep命令,只显示我们关心的指定包名的动态日志。命令如下:

tail -f 日志.log | grep a.b.c.name

总结

在面对纷扰无序的文本时,如果想快速找到你关心的信息,grep是首选命令。本文先介绍grep基本匹配内容。如果有良好的正则基础,那grep加正则表达式,基本能让你在黑框框里所向披靡,一往无前。

不是经验的经验

在Linux的命令行操作过程中,尤其是grep命令时,我们经常会使用管道|,但由于黑框下,全角和半角的区分不明显。所以下面两个命令看似相同却输出不同。

shuanghu:~ shuanghu$ echo "aa" |grep "aa"
aa
shuanghu:~ shuanghu$ echo "aa" |grep "aa"
aa |grep aa

因为第一个是半角,所以是管道,执行了grep命令;而第二个都成了echo的参数,所以进行了输出。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值