当前位置:首页>Linux>010 Linux查找指令三剑客:一篇搞定Linux所有查找场景

010 Linux查找指令三剑客:一篇搞定Linux所有查找场景

  • 2026-09-10 15:28:47
010 Linux查找指令三剑客:一篇搞定Linux所有查找场景

Linux查找指令三剑客:find、locate、grep(补充:管道符实战)

文件找不到?内容搜不到?一篇搞定Linux所有查找场景

一、find — 最强文件查找工具

find 是Linux下最强大、最灵活的文件查找命令,可以在指定目录中按各种条件搜索文件。

基本语法

find [搜索范围] [选项] [匹配条件]

常用选项

选项
功能
示例
-name
按文件名查找(区分大小写)
find /home -name "hello.txt"
-iname
按文件名查找(忽略大小写)(iname没有空格)
find /home -iname "Hello.TXT"
-user
按所有者查找
find /opt -user tom
-size
按文件大小查找
find / -size +100M
-type
按文件类型查找(f=文件,d=目录)
find / -type d -name "logs"
-mtime
按修改时间查找
find / -mtime -7
(7天内修改)
-exec
对查找到的文件执行操作
find /tmp -name "*.log" -exec rm {} \;

搜索范围写法

写法
含义
/
从根目录开始搜索(整个系统)
.
从当前目录开始搜索
~
从当前用户家目录开始搜索
/home
从指定目录开始搜索

实战案例

# 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 快得多,但依赖数据库的时效性。

基本语法

locate 文件名

实战案例

# 查找nginx.conflocate nginx.conf# ⚠️ 新安装的文件可能查不到!# 原因:locate数据库没有更新# 解决:手动更新数据库updatedb# 更新后再查找locate nginx.conf# ✅ 现在能找到了

locate vs find 对比

对比项
locate
find
搜索速度
⚡ 极快(查数据库)
🐢 较慢(遍历磁盘)
实时性
❌ 依赖数据库更新
✅ 实时搜索
灵活性
仅按文件名
✅ 支持多种条件(大小、时间、类型等)

💡 建议:快速查找已知文件用 locate,复杂条件搜索用 find。

三、grep — 文件内容搜索(含管道符实战)

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
(不匹配"tom")
-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 进程名
查看进程(不含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
找7天内修改的文件
find . -mtime -3
find . -exec 命令 {} \;
找到后执行操作
find . -name "*.log" -exec rm {} \;
locate 文件名
快速定位文件
locate nginx.conf
updatedb
更新locate数据库
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

📌 如果觉得有用,欢迎点赞、在看、转发三连!

最新文章

随机文章