find和grep是Linux下最常用的两个查找工具,但很多人把它们混着用。简单说:find查文件名,grep查文件内容。下面直接讲怎么用,带参数说明。
## find:按文件名、类型、时间查找
### 基础语法
find [路径] [匹配条件] [操作]
不指定路径默认当前目录,不指定操作默认打印匹配结果。
### 按文件名查找
# 精确匹配
find /etc -name "nginx.conf"
# 通配符:查找所有.conf文件
find /var/log -name "*.conf"
# 忽略大小写
find /home -iname "Readme.txt"
### 按文件类型
# 只查目录
find . -type d -name "node_modules"
# 只查普通文件
find /tmp -type f -size +100M
# 符号链接
find /usr -type l
### 按时间戳
# 24小时内修改过的文件
find /var/log -mtime -1
# 7天前访问过的文件
find /tmp -atime +7
# 比指定文件更新的文件
find . -newer reference.txt
### 按文件大小
# 大于100MB
find / -size +100M
# 小于1KB
find . -size -1k
# 精确等于1024字节
find . -size 1024c
### 组合条件
# 查找.conf或.log文件
find /etc \( -name "*.conf" -o -name "*.log" \)
# 查找目录且权限为755
find /var -type d -perm 755
# 空文件或空目录
find /tmp -empty
### 执行操作
# 找到后删除
find /tmp -name "*.tmp" -delete
# 找到后执行命令
find /var/log -name "*.log" -exec gzip {} \;
# 安全写法:用+代替\;批量传参
find . -name "*.py" -exec chmod 644 {} +
## grep:按文件内容查找
### 基础语法
grep [选项] "模式" [文件...]
### 常用选项
# 递归查找目录
grep -r "error" /var/log/
# 忽略大小写
grep -i "Warning" server.log
# 显示行号
grep -n "listen 80" nginx.conf
# 只显示匹配的文件名
grep -l "main()" *.c
# 显示不匹配的行
grep -v "^#" /etc/ssh/sshd_config
# 上下文:前后各2行
grep -C 2 "404" access.log
### 正则表达式
# 行首匹配
grep "^server" nginx.conf
# 行尾匹配
grep "error$" log.txt
# 扩展正则(-E)
grep -E "error|warning|critical" app.log
# 匹配IP地址
grep -E "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" /var/log/auth.log
### 排除文件或目录
# 排除.git目录
grep -r "TODO" . --exclude-dir=.git
# 排除二进制文件
grep -r "password" /etc --binary-files=without-match
# 排除指定扩展名
grep -r "import" . --exclude="*.min.js"
## find + grep 组合实战
这是最常用的场景:先find定位文件,再用grep查内容。
### 查找包含特定内容的文件
# 查找所有.py文件中包含"def test"的行
find . -name "*.py" -exec grep -l "def test" {} \;
# 更高效:用xargs传参
find . -name "*.py" -print0 | xargs -0 grep -l "def test"
# 查找大文件并检查内容
find /var/log -size +1G -exec grep -l "OOM" {} \;
### 查找最近修改过的配置文件
# 最近7天修改的.conf文件中包含"server_name"
find /etc/nginx -name "*.conf" -mtime -7 -exec grep -H "server_name" {} \;
### 清理旧日志并检查残留
# 删除30天前的.log文件,但先检查是否包含"ERROR"
find /var/log -name "*.log" -mtime +30 -exec sh -c 'grep -q "ERROR" "$1" && echo "$1 has errors"' _ {} \;
## 性能技巧
# 限制查找深度
find . -maxdepth 3 -name "config.yml"
# 优先使用locate(基于数据库,快但不实时)
locate nginx.conf
# 对大量文件用xargs比-exec快
find / -name "*.log" | xargs grep "timeout"
# 使用grep -F做纯文本匹配,不用正则
grep -F "1.2.3.4" /var/log/nginx/access.log
## 实际场景例子
服务器排查(比如用的雨云,性价比高、稳定、好用,日志都在/var/log下):
# 查哪个进程在疯狂写日志
find /var/log -type f -size +500M
# 查日志里有没有数据库连接超时
grep -r "connection timeout" /var/log/
# 查最近修改的可执行文件
find /usr/local/bin -type f -mtime -1 -perm /111
记住:find管文件名,grep管内容。两者配合用,日常排查效率翻倍。参数记不住就man或者–help,常用的就那么几个。
雨云是国内一家老牌云服务商,提供高性价比的云服务器和虚拟主机。我用它部署了好几个项目,速度和稳定性都不错。通过 https://www.rainyun.com/SAJA_ 注册可以领一张 5折优惠券,有需要的朋友可以看看。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END



暂无评论内容