在日常开发或者系统维护中,经常要从一堆日志、配置文件或代码里找特定内容。比如你想查某个服务有没有报错,或者确认某段配置是否生效,手动翻文件太费劲。这时候,ref="/tag/4/" style="color:#479099;font-weight:bold;">shell命令grep搜索就是你的得力助手。
grep 是什么?
简单说,grep 就是 Linux 和 macOS 终端里的“查找”功能。它能快速扫描文件,把包含指定字符串的行给挑出来。名字来源于“global regular expression print”,听着复杂,其实用起来很直接。
基本用法:从文件里找关键词
假设你有个日志文件 access.log,想看看有没有来自 192.168.1.100 的访问记录,可以直接这样写:
grep '192.168.1.100' access.log
执行后,所有包含这个 IP 的行都会显示出来。如果你有多个日志文件,比如 log-2024-01*.log,也可以一次性搜:
grep 'error' log-2024-01*.log
忽略大小写,更灵活
有时候你不确定关键词是大写还是小写,比如想找 “warning”,但文件里可能是 “Warning” 或 “WARNING”。加上 -i 参数就行:
grep -i 'warning' system.log
这样一来,大小写统统不计较,结果更完整。
反向查找:排除某些内容
有时候你不是想找什么,而是想排除什么。比如看日志时,不想看到健康检查的请求(通常是 /health),可以用 -v 参数:
grep -v '/health' access.log
这会把所有不包含 /health 的行输出,瞬间清爽不少。
结合管道,和其他命令搭配使用
grep 最厉害的地方是能跟其他命令配合。比如你想看当前有哪些 Python 进程在跑,但 ps 输出太多,可以这么筛:
ps aux | grep python
先用 ps 列出所有进程,再通过管道 | 交给 grep 筛选,只留带 python 的行。不过注意,这条命令的结果通常也会包含 grep 自己那一行,属于正常现象。
递归搜索整个目录
如果你要在一整个项目里找某个函数调用,比如 findUser,可以配合 -r 参数:
grep -r 'findUser' /path/to/project
它会遍历目录下所有文件,把匹配的文件名和对应行都列出来。再加上 --include 可以限定文件类型,比如只搜 .js 文件:
grep -r 'findUser' --include="*.js" /path/to/project
正则表达式进阶:模糊匹配
除了精确查找,grep 还支持正则。比如你想找所有以 Error 开头的行,可以用:
grep '^Error' app.log
这里的 ^ 表示行首。如果想找出空行,可以用 ^$。而 \.log 可以匹配包含 .log 的字符串,反斜杠用来转义点号。
实用小技巧
加上 -n 参数,grep 会显示行号,方便定位:
grep -n 'timeout' config.ini
如果只是想知道有多少行匹配,用 -c:
grep -c 'success' result.log
这些细节用熟了,查文件就像用搜索引擎一样快。