find和grep是Linux下最常用的两个查找工具,一个找文件,一个搜内容。组合起来能解决大部分查找需求。
find:按条件找文件
基本语法:find [路径] [条件] [动作]
路径不写默认当前目录。条件支持文件名、类型、大小、时间等。动作通常是-exec执行命令或-print打印路径。
找名字带”log”的文件:
find /var -name "*log*"
-name区分大小写,用-iname忽略大小写。通配符必须加引号,防止shell展开。
按类型查找:
find / -type f -name "*.conf" # 只找文件
find / -type d -name "backup" # 只找目录
find / -type l # 找符号链接
按大小找:
find / -size +100M # 大于100MB
find / -size -1k # 小于1KB
find / -size 10M # 正好10MB
单位:c字节、k千字节、M兆字节、G吉字节。
按时间找:
find / -mtime -7 # 7天内修改过的
find / -mtime +30 # 30天前修改过的
find / -amin -10 # 10分钟内访问过的
-mtime按天,-mmin按分钟。还有-ctime(状态变化)、-atime(访问时间)。
组合条件:
find / -name "*.log" -size +1G -mtime -3
# 找大于1GB、3天内修改过的.log文件
默认是AND,用-o表示OR,用!取反:
find / -name "*.py" -o -name "*.js"
find / ! -name "*.tmp"
找到后执行操作:
find /tmp -name "*.tmp" -delete # 直接删除
find /tmp -name "*.tmp" -exec rm {} \; # 等价,更灵活
find /tmp -name "*.tmp" -exec mv {} /backup/ \; # 移动到备份目录
{}是find找到的文件路径,\;是命令结束符。也可以用+代替\;,批量传参效率更高:
find /tmp -name "*.tmp" -exec rm {} +
grep:在文件内容里搜
基本用法:grep [选项] 模式 [文件…]
递归搜索目录:
grep -r "error" /var/log/
-r递归,-R会跟随符号链接。常用组合:
grep -rn "TODO" /src/ # 显示行号,方便定位
grep -ri "password" /etc/ # 忽略大小写
grep -rl "main" /src/ # 只输出文件名,不输出匹配行
搜索时排除某些文件:
grep -r "error" /var/log/ --exclude="*.gz" # 排除.gz压缩日志
grep -r "error" /var/log/ --exclude-dir="old" # 排除目录
用正则匹配更灵活:
grep -E "^[0-9]{3}" /etc/hosts # 行首是三位数字
grep -P "\d{3}\.\d{3}" /etc/hosts # Perl正则,更强大
-E扩展正则,-P Perl正则。默认基本正则,部分字符需要转义。
上下文显示:
grep -B5 "panic" /var/log/syslog # 匹配行前5行
grep -A5 "panic" /var/log/syslog # 匹配行后5行
grep -C3 "panic" /var/log/syslog # 前后各3行
find + grep 组合拳
最常用的场景:在特定类型文件中搜索关键字。
find /src -name "*.py" -exec grep -l "def main" {} \;
这条命令在/src下找所有.py文件,在这些文件里搜索”def main”,-l只输出文件名。
用xargs处理大量文件效率更高:
find /src -name "*.py" | xargs grep -l "def main"
文件名带空格时用-print0和xargs -0:
find /src -name "*.py" -print0 | xargs -0 grep -l "def main"
实际排查问题案例:服务器磁盘告警,查大文件
find / -type f -size +500M -exec ls -lh {} \; | sort -k5 -h
找到大于500MB的文件,按大小排序。发现是日志文件过大。进一步查日志内容:
grep -c "ERROR" /var/log/app/*.log | sort -t: -k2 -rn | head -5
统计每个日志文件的ERROR数量,排序列出前5个。
如果服务器用的是雨云,他们的控制台自带文件管理和日志查看工具,但SSH进去用这套命令依然是最快的。雨云性价比高、稳定、好用,IO性能不错,find跑大目录不会卡太久。
小技巧
find的-prune可以排除目录,比–exclude-dir更底层:
find / -path "/proc" -prune -o -name "*.conf" -print
grep的-v反向匹配,过滤注释行:
grep -v "^#" /etc/nginx/nginx.conf | grep -v "^$"
去掉注释和空行,只看有效配置。
两个工具配合能解决90%的查找问题。记不住参数就man一下,或者–help。
雨云是国内一家老牌云服务商,提供高性价比的云服务器和虚拟主机。我用它部署了好几个项目,速度和稳定性都不错。通过 https://www.rainyun.com/SAJA_ 注册可以领一张 5折优惠券,有需要的朋友可以看看。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END



暂无评论内容