Linux查找指令三剑客:find、locate、grep(补充:管道符实战)
文件找不到?内容搜不到?一篇搞定Linux所有查找场景
一、find — 最强文件查找工具
find 是Linux下最强大、最灵活的文件查找命令,可以在指定目录中按各种条件搜索文件。
基本语法
常用选项
| | |
|---|
-name | | find /home -name "hello.txt" |
-iname | | find /home -iname "Hello.TXT" |
-user | | find /opt -user tom |
-size | | find / -size +100M |
-type | | find / -type d -name "logs" |
-mtime | | find / -mtime -7 |
-exec | | find /tmp -name "*.log" -exec rm {} \; |
搜索范围写法
实战案例
# 1. 按文件名查找(区分大小写)find /home -name 'hello.txt'# 2. 按文件名查找(忽略大小写)find /home -iname 'Hello.txt'# 能匹配 hello.txt / HELLO.TXT# 3. 按大小查找(+大于,-小于)find / -size +200M# 查找大于200M的文件find / -size -1M# 查找小于1M的文件find / -size 100M# 查找正好100M的文件# 4. 按所有者查找find /opt -user wol# 查找wol拥有的所有文件# 5. 按类型查找(只找目录)find / -type d -name 'nginx'# 查找名为nginx的目录# 6. 按修改时间查找find / -mtime -3# 3天内修改过的文件find / -mtime +30# 30天前修改过的文件# 7. 组合条件(查找大于100M且文件名包含log的文件)find / -size +100M -name "*log*"# 8. 找到后执行操作(找到所有.log文件并删除)find /var/log -name "*.log" -exec rm {} \;
二、locate — 极速文件查找
locate 通过预建数据库快速定位文件,速度比 find 快得多,但依赖数据库的时效性。
基本语法
实战案例
# 查找nginx.conflocate nginx.conf# ⚠️ 新安装的文件可能查不到!# 原因:locate数据库没有更新# 解决:手动更新数据库updatedb# 更新后再查找locate nginx.conf# ✅ 现在能找到了
locate vs find 对比
💡 建议:快速查找已知文件用 locate,复杂条件搜索用 find。
三、grep — 文件内容搜索(含管道符实战)
grep 用于搜索文件内容,而非文件名。它从文本中筛选包含指定模式的行,是日志分析和文本处理的绝对主力。
基本语法
常用选项
| | |
|---|
-n | | grep -n "root" /etc/passwd |
-i | 忽略大小写 | grep -i "error" app.log |
-r | 递归搜索 | grep -r "passwd" /etc/ |
-v | 反向匹配 | grep -v "debug" app.log |
-c | | grep -c "error" app.log |
-l | | grep -l "root" /etc/* |
-w | | grep -w "to" file.txt |
-E | | grep -E "error|fail" app.log |
基础搜索案例
# 1. 在文件中搜索关键词grep "root" /etc/passwd# 2. 搜索并显示行号grep -n "root" /etc/passwd# 3. 忽略大小写搜索grep -i "error" app.log# 匹配 error / Error / ERROR# 4. 递归搜索整个目录grep -r "passwd" /etc/# 5. 递归搜索 + 显示行号grep -rn "passwd" /etc/# 6. 统计匹配行数grep -c "error" /var/log/syslog# 7. 反向匹配(排除包含关键词的行)grep -v "DEBUG" app.log
🔥 管道符(|)配合 grep — 最常用组合拳
管道符 | 的作用:将前一个命令的输出结果,传递给后一个命令作为输入。
# 管道符基本模型命令1 | 命令2# 命令1的输出 → 命令2的输入
核心场景:搜索结果筛选、日志过滤、进程过滤
场景1:查看并筛选文件内容
# 先cat查看文件,再grep筛选包含”int”的行,显示行号cat 55.sh | grep -n ”int”# 等价写法(不需要cat)grep -n ”int” 55.sh# 查看文件,排除注释行(以#开头)cat app.conf | grep -v ”^#”# 查看文件,排除空行cat app.conf | grep -v ”^$”
场景2:进程管理中过滤(高频场景)
# 查看所有进程,只显示包含nginx的ps aux | grep nginx# 查看sshd服务进程(去掉grep自身)ps aux | grep sshd | grep -v grep# 🔥 更优雅的写法:直接避免grep自身出现ps aux | grep [s]shd# 正则技巧,[]不会被匹配到自身[root@localhost boot]# ps aux | grep sshd | grep -v greproot 1647 0.0 0.0 9148 6744 ? Ss 7月03 0:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startupsroot 3214 0.0 0.1 16236 11728 ? Ss 7月03 0:00 sshd-session: wal [priv]root 3218 0.0 0.1 16200 11700 ? Ss 7月03 0:00 sshd-session: wal [priv]wal 3235 0.1 0.1 17340 9060 ? S 7月03 1:56 sshd-session: wal@pts/0wal 3296 0.0 0.1 16504 8292 ? S 7月03 0:00 sshd-session: wal@notty[root@localhost boot]# ps aux | grep sshdroot 1647 0.0 0.0 9148 6744 ? Ss 7月03 0:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startupsroot 3214 0.0 0.1 16236 11728 ? Ss 7月03 0:00 sshd-session: wal [priv]root 3218 0.0 0.1 16200 11700 ? Ss 7月03 0:00 sshd-session: wal [priv]wal 3235 0.1 0.1 17340 9060 ? S 7月03 1:56 sshd-session: wal@pts/0wal 3296 0.0 0.1 16504 8292 ? S 7月03 0:00 sshd-session: wal@nottyroot 405089 0.0 0.0 227720 2272 pts/0 S+ 16:11 0:00 grep --color=auto sshd[root@localhost boot]# ps aux | grep [s]shdroot 1647 0.0 0.0 9148 6744 ? Ss 7月03 0:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startupsroot 3214 0.0 0.1 16236 11728 ? Ss 7月03 0:00 sshd-session: wal [priv]root 3218 0.0 0.1 16200 11700 ? Ss 7月03 0:00 sshd-session: wal [priv]wal 3235 0.1 0.1 17340 9060 ? S 7月03 1:56 sshd-session: wal@pts/0wal 3296 0.0 0.1 16504 8292 ? S 7月03 0:00 sshd-session: wal@notty
💡 技巧解析:grep [s]shd 用正则 [s] 匹配字母 s,搜索字符串实际是 sshd。但 grep [s]shd 自身的命令行中是 [s]shd,不包含 sshd,所以不会被自己匹配到。比 grep -v grep 更简洁。
场景3:历史命令中搜索
# 查看所有历史命令,筛选包含”ssh”的history | grep ssh# 查看最近20条历史,筛选包含”tar”的history 20 | grep tar
场景4:日志实时监控(组合tail -f)
# 实时跟踪日志,只显示包含”ERROR”的行tail -f /var/log/app.log | grep ERROR# 实时跟踪日志,显示错误和警告(忽略大小写)tail -f /var/log/app.log | grep -i ”error\|warn”
场景5:多管道组合筛选
# 查看日志 → 筛选ERROR → 再筛选不包含”ignore”的 → 取前10行cat app.log | grep ERROR | grep -v ”ignore” | head -10# 查看所有进程 → 筛选java进程 → 只显示PID列ps aux | grep java | awk '{print $2}'# 查看Nginx访问日志 → 筛选404 → 提取IP → 统计前5名cat access.log | grep ”404” | awk '{print $1}' | sort | uniq -c | sort -nr | head -5
场景6:结合cut提取特定列
# 查看passwd → 筛选root → 提取第1列(用户名)cat /etc/passwd | grep root | cut -d”:” -f1# 查看所有登录用户 → 筛选root → 只显示用户名who | grep root | awk '{print $1}'
grep 实战场景速查
| |
|---|
| grep "关键词" 文件名 |
| grep -n "关键词" 文件名 |
| grep -r "关键词" 目录/ |
| cat 文件 | grep -n "关键词" |
| ps aux | grep 进程名 |
| ps aux | grep [进]程名 |
| history | grep 关键词 |
| tail -f 日志 | grep 关键词 |
| grep -c "关键词" 文件 |
| grep -v "关键词" 文件 |
| grep -E "关键词1|关键词2" 文件 |
四、三者核心区别(一张图看懂)
┌──────────────────────────────────────────────┐ │ ││ find → 按【文件名/属性】找文件 ││ 场景:忘记文件放哪了,按名字/大小/时间找 ││ ││ locate → 按【文件名】快速找文件(查数据库) │ │ 场景:快速定位已知文件,记得跑updatedb │ │ ││ grep → 按【文件内容】找文本 ││ 场景:在日志/代码/配置中搜索关键词 ││ ││ 管道符 → 把【前一个命令的输出】传给【后一个命令】 ││ 场景:组合多个命令,实现复杂的数据处理 ││ │└───────────────────────────────────────────────┘
五、实战综合演练
# 场景1:查找大于100M的日志文件find /var/log -size +100M -name "*.log"# 场景2:在Nginx配置中搜索”proxy_pass”grep -r "proxy_pass" /etc/nginx/# 场景3:查看脚本55.sh中所有包含"int"的行(带行号)cat 55.sh | grep -n "int"# 场景4:查看所有bash进程ps aux | grep bash# 场景5:查看历史命令中与"find"相关的记录history | grep find# 场景6:实时监控系统日志中的错误信息tail -f /var/log/messages | grep -i error# 场景7:统计access.log中包含"404"的行数grep -c "404" /var/log/nginx/access.log# 场景8:查找所有配置文件中包含”root”的文件名grep -l "root" /etc/*.conf# 场景9:查看passwd文件中所有登录Shell为/bin/bash的用户grep "/bin/bash" /etc/passwd | cut -d":" -f1# 场景10:多层管道组合# 查看所有进程 → 筛选nginx → 提取PID → 强制结束所有nginx进程ps aux | grep nginx | grep -v grep | awk '{print $2}' | xargs kill -9# 场景11:在日志中搜索错误,排除测试日志,只看最近20行grep -i error app.log | grep -v test | tail -20# 场景12:统计访问日志中TOP 5 IPcat access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -5
六、命令速查卡片
| | |
|---|
find / -name "文件名" | | find /home -name "*.txt" |
find / -size +100M | | find / -size +200M |
find . -type d | | find . -type d -name "logs" |
find . -mtime -7 | | find . -mtime -3 |
find . -exec 命令 {} \; | | find . -name "*.log" -exec rm {} \; |
locate 文件名 | | locate nginx.conf |
updatedb | | sudo updatedb |
grep "关键词" 文件 | | grep "error" app.log |
grep -r "关键词" 目录/ | | grep -r "passwd" /etc/ |
grep -n "关键词" 文件 | | grep -n "root" passwd |
grep -i "关键词" 文件 | | grep -i "error" log |
grep -c "关键词" 文件 | | grep -c "error" log |
命令 | grep xxx | | ps aux | grep nginx |
cat 文件 | grep -n "关键词" | | cat 55.sh | grep -n "int" |
tail -f 日志 | grep 关键词 | | tail -f app.log | grep ERROR |
📌 如果觉得有用,欢迎点赞、在看、转发三连!