[TOC]
Linux文件搜索
Linux文件搜索命令
find -查找目录下的文件
- 根据多种条件(文件名、大小、时间、权限等)实时搜索文件系统,并能对搜索到的文件执行操作
语法
find [路径] [搜索条件] [执行操作]
-
路径:指定搜索的起始目录(默认当前目录)
-
搜索条件:按名称、类型、大小、时间、权限等过滤
-
执行操作:对匹配文件执行的动作
-
常用选项:
参数 | 描述 |
---|---|
-name |
按文件名查找(区分大小写),支持通配符 |
-iname |
文件名查找(不区分大小写),支持通配符 |
-type f |
按文件类型搜索,f 代表普通文件,d 代表目录 |
-size |
按文件大小搜索 |
-user |
按文件所有者搜索 |
-mtime |
时间单位为天,按文件修改时间筛选(+n 超过 n 天,-n n 天内,n 正好 n 天) |
-atime |
时间单位为天,按文件最后访问时间筛选 |
-ctime |
时间单位为天,按文件最后修改时间筛选 |
-mmin |
时间单位为分钟,按文件内容最后修改时间筛选 |
-exec 命令 {} \; |
执行命令,{} :当前文件名的占位符 \; :命令结束符 |
-a 或空格 |
AND 与(默认) |
-o |
OR 或 |
! |
NOT 非 |
\(条件 \) |
组合条件 |
- 按名称查找
# 查找当前目录下名为 "file.txt" 的文件
$ find . -name "file.txt"
# 忽略大小写查找所有 ".log" 文件
$ find /var/log -iname "*.log"
- 按类型查找
# 查找所有目录(d表示目录,f表示文件,l表示符号链接)
$ find /home -type d -name "backup*"
# 查找所有空文件
$ find . -type f -empty
- 按大小查找
# 查找大于 100MB 的文件(+表示大于,-表示小于)
$ find / -type f -size +100M
# 查找小于 1KB 的文件
$ find . -type f -size -1k
- 按时间查找
# 查找 7 天内修改过的文件(mtime:修改时间,atime:访问时间,ctime:状态变更时间)
$ find /etc -type f -mtime -7
# 查找恰好 30 天前被访问的文件
$ find /var/log -type f -atime 30
# 查找 10 分钟内被修改的文件
$ find /tmp -type f -mmin -10
- 按权限或所有者查找
# 查找权限为 644 的文件
$ find . -type f -perm 644
# 查找属于用户 "alice" 的文件
$ find /home -user alice
- 执行操作(-exec 或 -delete)
# 删除所有扩展名为 ".tmp" 的文件(确认后再执行!)
$ find /tmp -type f -name "*.tmp" -delete
# 将找到的 ".log" 文件压缩为 ".gz"
$ find /var/log -type f -name "*.log" -exec gzip {} \;
# 查找并显示详细信息(-ls 等价于 ls -l)
$ find . -type f -size +1G -ls
- 组合条件(与、或、非)
# 查找大于 10MB 且扩展名为 ".log" 的文件
$ find /var/log -type f -size +10M -name "*.log"
# 查找 7 天内修改过 或 属于用户 "bob" 的文件
$ find /data -type f \( -mtime -7 -o -user bob \)
# 查找非 ".txt" 结尾的文件
$ find . -type f ! -name "*.txt"
which -定位文件位置
- 在
$PATH
环境变量指定的路径中搜索可执行文件 - 只返回第一个匹配的可执行文件
示例
# 查看 python 命令的实际位置
$ which python
/usr/bin/python
# 查看多个命令的位置
$ which ls grep mv rm
/bin/ls
/bin/grep
/bin/mv
/bin/rm
# 显示所有匹配结果 (-a 选项)
$ which -a python
/usr/bin/python
/home/user/miniconda3/bin/python
whereis -定位程序的多类型文件
- whereis是搜索程序名,如果是一个普通的文件是找不到的
示例
$ whereis ls
ls: /bin/ls /usr/share/man/man1/ls.1.gz
$ whereis python
python: /usr/bin/python3.8 /usr/bin/python /usr/lib/python3.8 ...
/usr/include/python3.8 /usr/share/python ...
/usr/share/man/man1/python.1.gz
grep -显示文件中的匹配行
- 文本搜索工具,用于在文件或标准输入中按行查找匹配指定模式的字符串,并输出匹配行
语法
grep [选项] "模式" [文件...]
- 常用选项:
选项 | 说明 | 示例 | |
---|---|---|---|
-i |
忽略大小写 | grep -i "warning" log.txt |
|
-v |
反向匹配(显示不包含的行) | grep -v "success" data.csv |
|
-n |
显示行号 | grep -n "function" script.js |
|
-c |
显示匹配的行数 | grep -c "404" access.log |
|
-l |
显示包含匹配项的文件名 | grep -l "TODO" project/* |
|
-L |
显示不包含匹配项的文件名 | grep -L "tested" *.py |
|
-r / -R |
递归搜索目录 | grep -r "Configuration" /etc/ |
|
-w |
整词匹配 | grep -w "user" accounts.txt |
|
-A n |
显示匹配行及后n行 | grep -A 3 "Exception" error.log |
|
-B n |
显示匹配行及前n行 | grep -B 2 "FAILURE" test.out |
|
-C n |
显示匹配行前后各n行 | grep -C 2 "core dumped" crash.log |
|
-o |
仅显示匹配部分 | grep -o "user_[0-9]*" logs.txt |
|
-E |
使用扩展正则表达式 | `grep -E "error | warn" app.log` | |
--color=auto |
高亮显示匹配内容 | grep --color "critical" alert.log |
|
-m n |
最多匹配次数 | grep -m 10 "match" bigfile |
|
-q |
静默模式(用于脚本判断) | if grep -q "found" file; then ... |
示例
- 基础搜索
# 在 file.txt 中查找包含 "error" 的行
$ grep "error" file.txt
# 从标准输入中查找(配合管道)
$ cat log.txt | grep "error"
- 忽略大小写
# 查找 "hello"(不区分大小写)
$ grep -i "hello" file.txt
- 显示匹配行的行号
# 显示匹配行及其行号
$ grep -n "success" file.txt
- 反向匹配(排除)
# 查找不含 "debug" 的行
$ grep -v "debug" log.txt
- 整词匹配(避免部分匹配)
# 查找完整包含 "main" 的行
$ grep -w "main" code.c
- 递归搜索目录中的文件
# 在 `/var/log` 目录下递归查找包含 "warning" 的文件
$ grep -r "warning" /var/log
- 显示匹配行及前后行(前后行行数不一致)
# 显示匹配行及匹配行的前2行(before)、后3行(after)
$ grep -A 3 -B 2 "exception" debug.log
- 显示匹配行及前后行(前后行行数一致)
# 显示匹配行及前后 2 行
$ grep -C 2 "error" file.txt
- 统计匹配行数
$ grep -c "failed" auth.log
- 仅输出匹配的部分
# 仅显示匹配的字符串(每行匹配部分单独输出)
$ grep -o "error" file.txt
正则表达式示例
- 基本正则表达式
# 查找以 "start" 开头的行
$ grep "^start" file.txt
# 查找以数字结尾的行
$ grep "[0-9]$" file.txt
# 查找包含 "error" 或 "fail" 的行
$ grep -E "error|fail" file.txt
- 扩展正则表达式(使用 -E)
# 查找连续 2-3 个字母 "a"
$ grep -E "a{2,3}" file.txt
# 查找以 "abc" 或 "def" 开头的行
$ grep -E "^(abc|def)" file.txt
实战场景
- 场景1:快速排查崩溃日志
# 查找最近崩溃的堆栈信息
$ grep -A 10 "Segmentation fault" /var/log/apport.log
- 场景2:提取配置文件中有效配置
# 过滤掉注释和空行
$ grep -vE '^\s*(#|$)' nginx.conf
- 场景3:结合 find 精准搜索
# 查找所有 Python 文件中包含 "import os" 的代码
$ find . -type f -name "*.py" -exec grep -l "import os" {} +
配合管道符|
使用
- 管道符将前一个命令的 标准输出(stdout) 作为后一个命令的 标准输入(stdin)
语法
命令A | grep [选项] "模式"
- 高频示例
场景 | 命令拆解 | 作用 |
---|---|---|
实时日志过滤 | tail -f /var/log/nginx/access.log \| grep "404" |
实时只看 404 请求 |
历史命令搜索 | history \| grep "scp" |
找出曾执行过的 scp 命令 |
进程筛选 | ps aux \| grep "python" |
只看含 python 的进程(但会多一条 grep 自身,见下方技巧) |
端口占用 | netstat -tunlp \| grep ":80" |
查看监听 80 端口的服务 |
大文件列表 | ls -lh \| grep "^-.*G" |
列出以 G 为单位的大文件 |
统计失败登录 | grep "Failed" /var/log/auth.log \| wc -l |
先过滤再计数 |
排除 grep 自身 | ps aux \| grep "[m]yapp" |
用正则 [m] 避免匹配到 grep myapp 这一行 |
多级过滤 | ps -ef \| grep "nginx" \| grep -v "grep" |
一级过滤后再下级过滤,查找 nginx 进程并排除 grep 自身 |
- 左边命令 标准输出(stdout) → 右边 grep 标准输入(stdin)
# 从 Apache 日志中查找包含 404 的错误记录
$ cat /var/log/apache/access.log | grep "404"
# 优化,避免使用 cat
$ grep "404" /var/log/apache/access.log
- THE END -
最后修改:2025年8月1日
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://www.qian777.cn/52.html
共有 0 条评论