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的参数,所以进行了输出。