Linux - 搜索查找篇

在 Linux 系统中,搜索查找类命令主要用于帮助用户快速定位文件、目录、命令以及特定的文本内容。以下是一些常用的搜索查找类命令:

  • grep:这是一个强大的文本搜索工具,它可以根据指定的关键字在文件中进行搜索,并输出包含该关键字的行。当配合-r(递归搜索)和-l(只列出文件名)选项使用时,可用来查找包含特定关键字的文件名及其路径。例如,grep -rl "关键字" /搜索的起始路径/会递归地搜索指定路径及其所有子目录,列出所有包含 “关键字” 的文件的完整路径。
  • find:功能非常强大的文件搜索命令,它可以根据文件名、文件类型、文件大小、文件时间戳等多种条件进行搜索。例如,find /path/to/search -name "*关键字*"会在指定目录下查找文件名包含 “关键字” 的所有文件;find /path/to/search -type d会查找指定目录下的所有目录;find /path/to/search -size +100M会查找指定目录下大于 100MB 的文件。
  • locate:通过搜索一个预先构建的数据库来快速查找文件,这个数据库包含了文件系统中所有文件的路径,因此locate的搜索速度非常快,但结果可能不是实时的,因为它依赖于一个定期更新的数据库。使用updatedb命令可以手动更新数据库。例如,locate 关键字会输出所有文件名或路径中包含 “关键字” 的文件。
  • whereis:用于定位命令的二进制文件、源代码和手册页的位置,主要用来查找系统命令和相关的文件。例如,whereis ls会输出ls命令的二进制文件、源代码和手册页的路径。
  • which:用于在用户的PATH环境变量所定义的目录中搜索可执行文件,并返回其完整路径,通常用来确认某个命令的具体位置。例如,which python会输出python命令的完整路径。

1)grep 文本搜索和过滤的核心工具

grep(Global Regular Expression Print,全局正则表达式打印)是 Linux/Unix 系统中文本搜索与过滤的核心工具,核心作用是:在文件或命令输出中,按「关键词/正则表达式」匹配文本行,并输出匹配到的内容(或反向过滤不匹配的内容)。

简单说:你想从一堆文本(文件、命令输出)中“揪出”包含某个关键词的行,就用 grep

一、核心用法(最常用,优先掌握)

参数 作用 常用场景
-i 忽略大小写匹配 模糊查找关键词(不区分大小写)
-n 显示匹配行的行号 定位文件中关键词的位置
-v 反向匹配(显示不包含关键词的行) 过滤日志中的无用信息
-c 统计匹配行数 统计关键词出现的次数
-r 递归搜索子目录下的所有文件 查找目录中所有文件的关键词
-w 匹配完整单词(避免部分匹配) 精确匹配单词(不匹配单词片段)
-E 支持扩展正则表达式 复杂匹配(或、至少一次等逻辑)
--include 只搜索指定类型的文件(如 *.txt 过滤文件类型,提高搜索效率

1. 基础用法:在文件中搜索关键词

格式:grep "关键词" 文件名
功能:从指定文件中,查找包含「关键词」的所有行,并输出这些行。

示例:

# 从 test.txt 中查找包含 "hello" 的行(关键词区分大小写)
grep "hello" test.txt

# 从 /etc/passwd 中查找包含 "root" 的行(比如 root 用户的配置)
grep "root" /etc/passwd

# 同时搜索多个文件:从 file1.txt、file2.txt 中查找 "test"
grep "test" file1.txt file2.txt

2. 不区分大小写匹配

参数:-i(ignore case)
功能:匹配时忽略大小写(比如 "Hello"、"HELLO"、"hello" 都能匹配到)。

示例:

# 从 test.txt 中查找包含 "hello" 的行,忽略大小写
grep -i "hello" test.txt

3. 显示匹配行的行号

参数:-n(line number)
功能:输出匹配到的行时,同时显示该行在文件中的行号。

示例:

# 查找 test.txt 中包含 "python" 的行,并显示行号
grep -n "python" test.txt

4. 反向匹配:显示不包含关键词的行

参数:-v(invert match)
功能:输出不包含关键词的所有行(过滤掉包含关键词的行)。

示例:

# 从 test.txt 中输出所有不包含 "error" 的行(过滤错误日志)
grep -v "error" test.txt

# 从 /etc/passwd 中输出非 root 用户的配置(过滤 root 行)
grep -v "root" /etc/passwd

5. 统计匹配行数

参数:-c(count)
功能:不输出匹配内容,只统计包含关键词的行的总数。

示例:

# 统计 test.txt 中包含 "warning" 的行数
grep -c "warning" test.txt

# 统计 /var/log/messages 中包含 "info" 的行数(日志统计)
grep -c "info" /var/log/messages

6. 搜索子目录下的所有文件

参数:-r-R(recursive,递归)
功能:递归搜索指定目录下的所有文件(包括子目录),查找包含关键词的行。

示例:

# 递归搜索 /home 目录下所有文件,查找包含 "tangge" 的行
grep -r "tangge" /home

# 递归搜索当前目录(. 表示当前)下所有 .txt 文件,查找 "test"
grep -r "test" . --include="*.txt"  # --include 过滤文件类型

7. 匹配整个单词(避免部分匹配)

参数:-w(word match)
功能:只匹配「完整单词」,不匹配单词的一部分(比如关键词 "test" 不会匹配 "test123"、"atest")。

示例:

# 从 test.txt 中只匹配完整的 "test" 单词,不匹配部分包含的情况
grep -w "test" test.txt

二、进阶用法:正则表达式匹配(强大灵活)

grep 支持正则表达式(默认基础正则,加 -E 支持扩展正则),能实现复杂匹配(比如匹配邮箱、IP、特定格式的字符串)。

1. 基础正则示例(无需加 -E

  • 匹配以某个字符开头的行:^关键词^ 表示行首)
    示例:查找 test.txt 中以 "user" 开头的行

    grep "^user" test.txt
    
  • 匹配以某个字符结尾的行:关键词$$ 表示行尾)
    示例:查找 test.txt 中以 "end" 结尾的行

    grep "end$" test.txt
    
  • 匹配任意单个字符:.(点号,匹配除换行外的任意一个字符)
    示例:查找包含 "he?lo"(? 是任意字符,比如 "hello"、"hulo"、"hxlo")的行

    grep "he.lo" test.txt
    
  • 匹配零个或多个前导字符:*(星号,匹配前面的字符出现 0 次或多次)
    示例:查找包含 "ho"、"hlo"、"hllo"、"hhhhlo" 等的行

    grep "h*lo" test.txt
    

2. 扩展正则示例(加 -E,简化语法)

扩展正则支持 +(至少一次)、?(零次或一次)、|(或)等符号,无需转义,更简洁。

参数:-E(extended regexp),等价于 egrep 命令。

示例:

# 匹配 "hello" 或 "world"(用 | 表示“或”)
grep -E "hello|world" test.txt

# 匹配 "he" 后面跟至少一个 "l"(用 + 表示“至少一次”),比如 "hell"、"heell"
grep -E "hel+l" test.txt

# 匹配 "http" 或 "https"(s 可选,用 ? 表示“零次或一次”)
grep -E "https?" test.txt

三、常用组合:与其他命令管道(|)配合

grep 常和其他命令(比如 lspscat)用管道 | 连接,过滤命令输出的结果(这是 Linux 中最强大的用法之一)。

示例:

# 过滤当前目录下的 .txt 文件(ls 输出中包含 .txt 的行)
ls | grep ".txt"

# 查找系统中运行的 nginx 进程(ps 输出中包含 nginx 的行)
ps aux | grep "nginx"

# 查看日志文件 /var/log/nginx/access.log,只显示包含 "404" 错误的行
cat /var/log/nginx/access.log | grep "404"

# 查找 /home 目录下所有 .log 文件,统计包含 "error" 的总行数
grep -r "error" /home --include="*.log" | wc -l  # wc -l 统计行数

四、常见注意事项

  1. 关键词包含空格/特殊字符:需要用单引号 ' 或双引号 " 包裹(单引号更安全,避免 Shell 解析特殊字符)。
    示例:查找包含 "hello world"(带空格)的行

    grep 'hello world' test.txt
    
  2. 匹配特殊字符(如 .*^:需要用反斜杠 \ 转义(基础正则中)。
    示例:查找包含 www.baidu.com 的行(. 是特殊字符,需转义)

    grep "www\.baidu\.com" test.txt
    
  3. 大文件搜索grep 效率很高,但大文件(比如几十GB日志)建议结合 head/tail 先截取部分内容,再过滤:

    tail -1000 /var/log/nginx/access.log | grep "404"  # 只看最后1000行的404错误
    

总结

grep 是 Linux 文本处理的“瑞士军刀”,核心用法就是「搜索关键词/正则 + 过滤输出」,配合管道 | 能解决大部分文本处理场景。

最常用的组合:

# 1. 文件中查找关键词(忽略大小写+显示行号)
grep -in "关键词" 文件名

# 2. 管道过滤命令输出
命令 | grep "关键词"

# 3. 递归查找目录中所有文件的关键词
grep -r "关键词" 目录名 --include="*.文件类型"

2)find 搜索文件和目录

find 是 Linux 中 最强大的文件/目录搜索命令——支持按文件名、类型、大小、时间、权限、所有者等多种条件精准查找,还能对找到的文件直接执行操作(如删除、复制),日常运维必备。以下是极简实用的用法总结,覆盖90%高频场景:

一、核心语法(通用格式)

find 搜索路径 搜索条件 操作动作(可选)
  • 搜索路径:默认是当前目录(.),可指定绝对路径(如 /home/data);
  • 搜索条件:最常用 (-name 文件名)(-type 类型)(-size 大小)(-mtime 时间) 等;
  • 操作动作:默认是“列出找到的文件”,可加 -delete(删除)、-exec(执行命令)等。

二、高频搜索场景(表格+示例)

分类 参数 核心作用 用法示例
文件名筛选 -name 匹配文件名,*模糊匹配
-iname 忽略大小写
🔍 按文件类型筛选 -type 区分文件 / 目录 / 软链接等 -type f(普通文件)、-type d(目录)、-type l(软链接)find /usr/bin -type f -name "*.sh"
📏 按文件大小筛选 -size 按大小匹配(支持 b/k/M/G) -size +100M(大于 100MB)、-size -10k(小于 10KB)、-size 5M(等于 5MB)find /tmp -size +500M
⏰ 按时间筛选 -mtime 按文件内容修改时间(天) -mtime -7(7 天内修改)、-mtime +30(超过 30 天未修改)find /var/log -type f -mtime +7 -delete(清理 7 天前日志)
-atime 按文件访问时间(天) -atime +10(超过 10 天未访问)
-ctime 按文件属性修改时间(天) -ctime -1(1 天内修改过权限 / 所有者)
-mmin/-amin 按时间(分钟)筛选 -mmin -60(1 小时内修改)
👤 按所有者 / 组筛选 -user 按文件所有者(用户名 / UID) find /home -user tangge(查找 tangge 的文件)
-group 按文件所属组(组名 / GID) find /data -group dev(查找 dev 组的文件)
-nouser 查找无所有者的文件(孤儿文件) find / -nouser(清理系统垃圾常用)
-nogroup 查找无所属组的文件 find / -nogroup
🔐 按权限筛选 -perm 按文件权限(数字 / 符号)匹配 -perm 777(权限为 777 的文件)、-perm -u+x(所有者有执行权限)find / -type f -perm 777(查找危险权限文件)
📁 路径筛选(不含 i 前缀) -path 按完整路径匹配(区分大小写) find / -path "*/etc/nginx/*"(匹配 /etc/nginx 下的所有文件)
-regex 按正则匹配路径 / 文件名(区分大小写) find /etc -regex ".*\.conf$"(匹配所有 .conf 结尾的文件)
-prune 排除指定目录(不递归进入) find /home -path "/home/tangge/tmp" -prune -o -name "*.txt"(排除 tmp 目录,查找其他 .txt 文件)
🚀 找到后操作 -delete 直接删除找到的文件(谨慎!) find /tmp -type f -name "*.tmp" -delete
-exec 对找到的文件执行命令 find /home -type f -name "*.sh" -exec chmod u+x {} \;(添加执行权限)
-ok 执行命令前先确认(比 -exec 安全) find /tmp -type f -mtime +30 -ok rm {} \;(删除前确认)
-print 输出找到的文件路径(默认动作,可省略) find /etc -name "nginx.conf" -print

1. 按文件名搜索(最常用)

需求 命令 说明
精确匹配文件名 find /home -name "test.txt" 查找 /home 下名为 test.txt 的文件(区分大小写)
模糊匹配(包含关键字) find /data -name "*report*" 查找 /data 下文件名包含 report 的文件(如 2024_report.pdf
忽略大小写 find /etc -iname "nginx.conf" 查找 /etc 下名为 nginx.conf 的文件(不区分大小写,如 Nginx.conf 也会匹配)

2. 按文件类型搜索

类型符号 含义 命令示例
f 普通文件(文档、脚本等) find /usr/bin -type f -name "*.sh"(查找 /usr/bin 下的 .sh 脚本文件)
d 目录 find /data -type d -name "backup"(查找 /data 下名为 backup 的目录)
l 软链接(快捷方式) find /home -type l -name "link*"(查找 /home 下名为 link 开头的软链接)

3. 按文件大小搜索

单位:b(字节)、k(KB)、M(MB)、G(GB);+=大于,-=小于,无符号=等于。

需求 命令
查找大于 100MB 的文件 find / -size +100M(搜索整个系统,慎用,可能较慢)
查找小于 10KB 的文件 find /home -size -10k
查找等于 5MB 的文件 find /data -size 5M

4. 按修改时间搜索

单位:d(天)、h(小时)、m(分钟);+=超过,-=以内。

需求 命令
查找 7 天内修改过的文件 find /var/log -type f -mtime -7(查找 /var/log 下7天内修改的日志文件)
查找超过 30 天未修改的文件 find /home -type f -mtime +30(可用于清理旧文件)
查找 1 小时内修改过的目录 find /data -type d -mmin -60

5. 按所有者/所属组搜索

需求 命令
查找所有者为 tangge 的文件 find /home -user tangge
查找所属组为 dev 的目录 find /data -group dev -type d

6. 按权限搜索

用数字权限(如 755644)指定,精准匹配文件权限。

需求 命令
查找权限为 777 的文件(危险权限,需清理) find / -type f -perm 777
查找所有者有执行权限的脚本 find /usr/local -type f -perm -u+x-u+x 表示所有者有执行权限)

三、找到文件后的操作(实用!)

1. 直接删除找到的文件(谨慎!)

# 删除 /tmp 下超过 30 天的日志文件(先不加 -delete 预览,确认后再加)
find /tmp -type f -name "*.log" -mtime +30 -delete
  • 建议:先执行 find /tmp -type f -name "*.log" -mtime +30 预览要删除的文件,确认无误后再加 -delete

2. 对找到的文件执行命令(-exec

语法:find ... -exec 命令 {} \;{} 代表找到的每个文件,\; 是命令结束标记)。

需求 命令
查找所有 .sh 脚本并添加执行权限 find /home -type f -name "*.sh" -exec chmod u+x {} \;
查找 tangge 所有文件并复制到 /backup find /home -user tangge -exec cp {} /backup/ \;

四、关键注意事项

  1. 搜索整个系统(find / ...)时,可能会遇到“权限不够”的报错,可加 -prune 跳过无权限目录,或用 sudo 提升权限:

    sudo find / -name "nginx.conf"  # 避免权限报错
    
  2. 模糊匹配时,文件名必须加引号(如 "*report*"),否则通配符(*)会被系统提前解析,导致搜索失败;

  3. -delete 是危险操作,删除前务必预览;

  4. 搜索速度:指定的路径越具体(如 /home/tangge 而非 /),搜索越快。

总结

find 核心用法:指定路径 + 精准条件 + 可选操作,日常高频场景:

  • 找文件:find 路径 -name "文件名"
  • 找目录:find 路径 -type d -name "目录名"
  • 清理旧文件:find 路径 -type f -mtime +天数 -delete
  • 批量操作文件:find 路径 -exec 命令 {} \;

简单记:find 是“文件搜索瑞士军刀”,需要什么条件就加什么参数,灵活且强大。

3)locate 快速定位文件/目录

locate 是 Linux/Unix 系统中快速查找文件/目录的命令,核心优势是「速度极快」——因为它不实时遍历磁盘,而是查询系统预建的「文件路径数据库」(默认是 /var/lib/mlocate/mlocate.db)。

一、核心原理

  • 系统会定期(通常是每天,由 cron 任务触发 updatedb 命令)扫描磁盘,将所有文件/目录的路径记录到数据库中;
  • locate 命令直接查询这个数据库,而非实时扫描磁盘,因此查找速度远快于 findfind 是实时遍历)。

二、基本用法(最常用)

1. 基础查找:直接匹配文件名/路径

格式:locate [文件名/关键词]
功能:查找所有路径中包含「关键词」的文件/目录(默认不区分大小写,模糊匹配)。

示例:

# 查找所有路径中包含 "test.txt" 的文件(比如 /home/xxx/test.txt、/tmp/test.txt 等)
locate test.txt

# 查找所有 .txt 后缀的文件(模糊匹配,包含路径中带 .txt 的情况)
locate .txt

# 查找路径中包含 "tangge" 的目录/文件(比如 /home/tangge、/home/xxx/tangge.doc 等)
locate tangge

2. 精确匹配:只匹配完整文件名(避免模糊匹配)

参数:-b(全称 --basename,只匹配文件名,不匹配路径中的关键词)
示例:

# 只查找「文件名 exactly 是 test.txt」的文件(不会匹配 /home/test.txt.bak 这类)
locate -b test.txt

# 只查找「文件名以 .txt 结尾」的文件(避免匹配路径中带 .txt 的情况)
locate -b "*.txt"

3. 区分大小写匹配

参数:-i(默认,不区分大小写)、-I(大写 i,强制区分大小写)
示例:

# 只匹配文件名包含 "Test.txt"(大写 T)的文件,不匹配 "test.txt"
locate -I Test.txt

4. 限制查找结果数量

参数:-n [数字](只输出前 N 条结果)
示例:

# 只显示前 5 个包含 "test.txt" 的文件
locate -n 5 test.txt

5. 显示文件路径的详细信息(类似 ls -l

参数:-l(全称 --long
示例:

# 查找 test.txt 并显示权限、大小、修改时间等信息
locate -l test.txt

三、关键注意事项(避坑重点)

1. 找不到刚创建的文件?—— 更新数据库!

因为 locate 依赖预建数据库,刚创建/删除的文件不会实时同步到数据库中,导致查找不到。
解决:手动更新数据库(需要 root 权限,因为扫描磁盘需要权限):

sudo updatedb  # 执行后会重新扫描所有磁盘,更新数据库(耗时根据磁盘大小而定)

2. locatefind 的核心区别(选择哪个?)

特性 locate find
查找速度 极快(查询数据库) 较慢(实时遍历磁盘)
实时性 差(依赖数据库更新) 强(实时扫描,能找到刚创建的文件)
查找条件 主要按「文件名/路径关键词」匹配 支持复杂条件(大小、权限、修改时间等)
权限要求 普通用户即可(查询数据库) 遍历目录需要对应权限(比如 /root 需 sudo)

使用场景

  • 快速查找已知文件名的文件(比如 locate nginx.conf)→ 用 locate
  • 复杂条件查找(比如「/home 下 24 小时内修改的、大于 100M 的 .log 文件」)→ 用 find

3. 排除某些目录查找

参数:-e(结合 /etc/updatedb.conf 配置)
默认情况下,updatedb 会跳过一些目录(比如 /tmp/proc/sys 等临时/虚拟文件系统),配置文件在 /etc/updatedb.conf 中。如果想让 locate 不查找某些目录,可修改该文件的 PRUNEPATHS 字段(需 root 权限)。

四、其他常用参数

参数 作用 示例
-r 按正则表达式匹配(替代模糊匹配) locate -r "^/home/.*\.txt$"(查找 /home 下的 .txt 文件)
-c 只统计匹配到的文件数量(不显示路径) locate -c test.txt(统计有多少个 test.txt)
-w 完全匹配关键词(避免部分匹配) locate -w "test.txt"(同 -b,但更严格)

总结

locate 是「快速查找文件」的工具,核心用法就是 locate 关键词,配合 -b(精确匹配)、-n(限制数量)、sudo updatedb(更新数据库)就能满足大部分场景。如果需要复杂条件(比如按文件大小、修改时间查找),再用 find

4)which 查找可执行命令路径

which 是 Linux/Unix 系统中查找可执行命令路径的工具,核心作用是:根据当前用户的 PATH 环境变量(系统查找可执行文件的路径列表),找到指定命令的绝对路径(比如 lscdlocate 等命令安装在哪里)。

简单说:你想知道一个命令“藏在系统的哪个文件夹里”,就用 which

一、核心用法(超简单,常用就1种)

1. 基础查找:直接跟命令名

格式:which [命令名]
功能:返回该命令在 PATH 中的绝对路径(找到第一个匹配的路径)。

示例:

# 查找 ls 命令的路径(通常是 /bin/ls)
[root@node01 /]which ls
alias ls='ls --color=auto'
        /usr/bin/ls

# 查找 locate 命令的路径(安装后通常是 /usr/bin/locate)
[root@node01 /]which locate
/usr/bin/locate

# 查找 yum 命令的路径(CentOS 系统通常是 /usr/bin/yum)
[root@node01 /]which yum
/usr/bin/yum

# 查找 python 命令的路径(可能是 /usr/bin/python 或 /usr/bin/python3)
[root@node01 /]which python
/usr/bin/python

执行结果示例(以 which ls 为例):

/bin/ls

2. 查找所有匹配的路径(不止第一个)

参数:-a(全称 --all
默认 which 只返回第一个匹配的路径,-a 会列出 PATH 中所有符合的路径。

示例:

# 查找所有 python 相关的可执行路径(比如同时有 python2 和 python3 时)
which -a python

# 查找所有 ls 相关的路径(通常只有1个,但部分系统可能有别名对应的路径)
which -a ls

二、关键特性(和其他查找命令的区别)

  1. 只找“可执行命令”
    which 仅查找 PATH 环境变量中记录的、能直接运行的命令(比如 lscat),不查找普通文件(比如 .txt.log)或目录——这是它和 findlocate 的核心区别。

  2. 不查找内置命令
    系统中有两类命令:

    • 外部命令:独立的可执行文件(比如 lslocate,存在于 /bin/usr/bin 等目录)→ which 能找到;
    • 内置命令:Shell 自带的命令(比如 cdechoalias,没有独立文件)→ which 找不到,会提示“无此命令”。

    示例(cd 是内置命令,which 找不到):

    which cd  # 输出:which: no cd in (/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)
    
  3. 遵循 PATH 顺序
    which 会按 PATH 环境变量中路径的顺序查找,返回第一个匹配的路径。比如 PATH/usr/local/bin:/bin:/usr/binwhich python 会先找 /usr/local/bin/python,找不到再找 /bin/python

三、常见使用场景

  1. 确认命令是否安装
    比如你安装了 locate 后,想确认是否安装成功(且能被系统找到),可以用 which locate——如果输出路径,说明安装成功;如果提示“no locate in ...”,说明没安装或路径没加入 PATH

  2. 区分同名命令
    系统中可能有多个同名命令(比如不同版本的 python),用 which -a python 可以列出所有可用的路径,避免用错版本。

  3. 查看命令的实际执行路径
    比如你设置了命令别名(alias ls='ls --color=auto'),用 which ls 能看到别名对应的原始命令路径(依然是 /bin/ls)。

四、和 whereisfind 的区别(避免用混)

命令 核心作用 查找范围 适用场景
which 查找可执行命令的路径 PATH 环境变量中的路径 确认命令是否安装、找命令路径
whereis 查找命令的可执行文件、源码、手册页 系统默认的命令安装目录 同时找命令+源码+手册(比如 whereis ls
find 查找任意文件/目录(支持复杂条件) 整个磁盘(指定目录) 查找普通文件、按大小/时间等条件查找

示例对比:

which ls        # 只返回 /bin/ls(可执行路径)
whereis ls      # 返回 ls: /bin/ls /usr/share/man/man1/ls.1.gz(可执行+手册)
find / -name ls # 查找全系统所有叫 ls 的文件(包括非可执行文件)

总结

which 是“命令专属查找工具”,用法简单、速度快,核心就是找可执行命令的路径。日常用得最多的场景:确认命令是否安装、区分同名命令版本。

常用命令就2个:

which 命令名    # 找第一个匹配的路径
which -a 命令名 # 找所有匹配的路径
posted @ 2025-11-05 21:32  【唐】三三  阅读(1)  评论(0)    收藏  举报