前言
在日常Linux运维、后端开发工作中,经常会遇到两个需求:我要找到服务器上某个文件在哪 、在一堆文件里面找出包含指定关键词的内容 。很多新手会混淆
find和grep:find 是找文件本身,grep 是在文件里搜文本内容,二者经常搭配使用。这篇文章把查找文件、搜索文本的常用命令、参数、实战案例一次性讲清楚。
一、find:在目录下查找文件(找文件)
find 是Linux最强大的文件查找命令,可以按文件名、文件大小、修改时间、文件类型等条件搜索,遍历指定目录及其子目录。
语法格式:
bash
find [搜索路径] [匹配条件]
1. 按文件名查找(最常用)
bash
# 在 /etc 目录下查找名称为 nginx.conf 的文件,精确匹配
find /etc -name "nginx.conf"
# 忽略大小写查找,-iname
find /etc -iname "nginx.conf"
# 模糊匹配,* 是通配符,查找所有 .log 后缀文件
find /var/log -name "*.log"
注意:name 后面的匹配字符串建议加双引号,避免shell提前解析通配符。
2. 按文件类型查找
-f:普通文件-d:目录-l:软链接
bash
# 查找 /home 下面所有目录
find /home -type d
# 查找所有普通文件
find /opt -type f
3. 按文件大小查找
单位:c字节、kKB、MMB、GGB
bash
# 查找大于100M的文件
find / -type f -size +100M
# 查找小于10k的文件
find /tmp -type f -size -10k
4. 按修改时间查找
-mtime:按修改时间,单位天-mmin:按修改时间,单位分钟
bash
# 查找7天内修改过的文件
find /var/log -mtime -7
# 查找最近30分钟修改的文件
find /opt -mmin -30
5. find 找到文件后直接执行操作(-exec)
找到文件之后,批量删除、批量查看,非常实用
bash
# 查找/tmp下所有 .txt 文件,然后删除
find /tmp -name "*.txt" -exec rm -f {} \;
# 找到日志文件,并用ls -l查看详情
find /var/log -name "*.log" -exec ls -l {} \;
{}代表find匹配到的每一个文件,\;是结束标记
补充:快速查找 locate
locate 查找速度比find快很多,它是读取系统数据库,不是实时遍历磁盘。
缺点:数据库不是实时更新,新增文件可能搜不到,需要手动更新数据库 updatedb
bash
locate nginx.conf
二、grep:在文件中搜索文本内容(搜内容)
grep 全称 Global Regular Expression Print,作用:在文件里搜索匹配的字符串,打印匹配行,日志排查、代码检索的神器。
基础语法:
bash
grep [参数] "关键词" 文件名
常用基础参数
bash
# 在 app.log 中搜索 error 关键词
grep "error" app.log
# -i 忽略大小写搜索
grep -i "error" app.log
# -n 显示匹配内容所在行号(高频)
grep -n "error" app.log
# -v 反向匹配,输出不包含关键词的行
grep -v "info" app.log
# -c 只统计匹配到的行数,不输出内容
grep -c "warn" app.log
# -o 只输出匹配到的关键词本身,而不是整行
grep -o "user_id:[0-9]*" app.log
递归搜索目录下所有文件 -r / -R
当不知道关键词在哪个文件里,递归遍历整个目录所有文件搜索:
bash
# -r 递归搜索 /opt 下所有文件,包含子目录
grep -r "timeout" /opt
# -rn 递归 + 显示行号,线上排查最常用组合
grep -rn "timeout" /opt
小提示:
grep -R会跟进软链接,grep -r默认不跟进软链接
高亮匹配内容
很多系统默认配置了高亮,如果没有,可以加上 --color=auto
bash
grep --color=auto -n "Exception" app.log
三、find + grep 组合使用(高频实战)
场景:找到所有日志文件,再在里面搜索报错信息
bash
# find找到所有log文件,交给grep搜索关键词
find /var/log -name "*.log" -exec grep -n "Exception" {} \;
四、管道符搭配:日志实时过滤(tail + grep)
线上看实时日志,只抓取报错,不用刷屏:
bash
tail -F app.log | grep -i error
五、正则简单使用(grep)
grep支持基础正则,高级正则可以用 egrep 或者 grep -E
bash
# 搜索 error 或者 warn
grep -E "error|warn" app.log
六、命令对比速查表
| 命令 | 核心作用 | 特点 |
|---|---|---|
| find | 查找文件/目录 | 实时遍历磁盘,支持文件名、大小、时间、类型多条件,慢但准确 |
| locate | 查找文件 | 读取数据库,速度快,数据非实时 |
| grep | 文件内搜索文本内容 | 匹配行、支持正则、递归检索 |
七、实战避坑小提示
find /从根目录搜索会遍历全部磁盘,速度很慢,尽量缩小搜索路径;- 用 find 搜索根目录会大量输出权限不足报错,可以加 2>/dev/null 屏蔽错误:
bash
find / -name "nginx.conf" 2>/dev/null
- grep 搜索关键词有空格、特殊符号时,一定要用双引号包裹;
- 不要直接 grep 二进制文件,会输出大量乱码;
- 递归grep大目录时,尽量限定文件后缀,减少搜索范围,提升速度。
八、小结
一句话分清两者:
✅ find:找文件在哪(按文件属性筛选)
✅ grep:在文件里面找文字(按内容筛选)
这两个命令是Linux检索的黄金组合,排查配置、检索代码、定位日志报错几乎每天都会用到,也是面试高频考点。