第9章 查找资料
所属:第三部分 查找资料 来源:Linux命令速查手册
Linux中查找文件和内容有两大类工具:
- locate:快速查找文件名(基于数据库)
- grep:在文件内容中搜索文本
9.1 搜索文件名数据库
locate filename
locate keyword在系统的文件名数据库中快速查找。
优点:速度极快,秒出结果 缺点:
- 数据库不是实时更新,新文件可能搜不到
- 只能按文件名搜,不能搜内容
示例:
locate bashrc
locate "*.pdf"9.2 搜索文件名数据库,不区分大小写
locate -i filename
locate --ignore-case filename忽略大小写搜索。
9.3 管理搜索文件名数据库时返回的结果
locate -n 10 filename
locate --limit=10 filename限制结果数量,只显示前N条。
统计匹配数量:
locate -c keyword9.4 更新locate使用的数据库
sudo updatedb手动更新locate的文件数据库。
- 系统通常每天自动更新一次(cron任务)
- 新装文件后想立即搜到,手动运行一下
- 数据库位置通常在
/var/lib/mlocate/
9.5 在文本文件中搜索匹配的模式
grep pattern filename在文件中搜索匹配的文本行,输出匹配的整行。
grep = Global Regular Expression Print
示例:
grep "error" logfile.txt
grep root /etc/passwd9.6 在文本文件中搜索特定模式的基础知识
grep支持正则表达式(Basic Regular Expressions)。
常用正则元字符
| 符号 | 含义 |
|---|---|
. | 匹配任意单个字符 |
* | 前一个字符出现0次或多次 |
^ | 行首 |
$ | 行尾 |
[abc] | 匹配字符集中任意一个 |
[^abc] | 匹配不在字符集中的任意一个 |
[a-z] | 匹配范围内的字符 |
\ | 转义特殊字符 |
示例:
grep "^root" /etc/passwd # 以root开头的行
grep "bash$" /etc/passwd # 以bash结尾的行
grep "er.or" file.txt # er和or之间任意一个字符扩展正则(ERE)
grep -E pattern filename
egrep pattern filename支持更多元字符:+、?、|、()、{n,m}
9.7 递归式地搜索文件中的文本
grep -r pattern directory/
grep -R pattern directory/递归搜索目录下所有文件中的文本。
示例:
grep -r "TODO" ~/projects/9.8 搜索文件中的文本,忽略大小写
grep -i pattern filename
grep --ignore-case pattern filename不区分大小写。
9.9 在文件中只搜索整个词
grep -w pattern filename
grep --word-regexp pattern filename只匹配完整单词,避免部分匹配。
例如搜 the 不会匹配 there、other。
9.10 显示搜索结果在文件中的行号
grep -n pattern filename
grep --line-number pattern filename显示匹配行的行号。
9.11 在其他命令的输出中搜索特定内容
command | grep pattern
ps aux | grep firefox
ls -l | grep ".txt"管道结合grep,过滤命令输出。
非常常用的组合!
9.12 查看文件中搜索内容的上下文信息
grep -C 2 pattern filename # 前后各2行(Context)
grep -B 2 pattern filename # 之前2行(Before)
grep -A 2 pattern filename # 之后2行(After)显示匹配行的上下文,方便查看周围内容。
9.13 显示没有包含搜索内容的行
grep -v pattern filename
grep --invert-match pattern filename反向匹配,显示不包含关键词的行。
示例:
# 过滤掉注释行和空行
grep -v "^#" config.conf | grep -v "^$"9.14 列出包含搜索内容的文件名
grep -l pattern directory/*
grep --files-with-matches pattern directory/*只显示匹配的文件名,不显示具体内容。
递归搜索时很有用:
grep -rl "pattern" directory/9.15 在搜索结果中进行搜索
grep pattern1 filename | grep pattern2
grep pattern1 filename | grep -v pattern3多次grep叠加,逐步缩小范围。
示例:
# 找包含error但不包含warning的行
grep "error" log.txt | grep -v "warning"9.16 小结
locate vs grep
| 工具 | 搜索对象 | 速度 | 实时性 | 场景 |
|---|---|---|---|---|
locate | 文件名 | 极快 | 依赖数据库 | 快速找文件位置 |
grep | 文件内容 | 较慢 | 实时 | 在文件中找文字 |
grep 常用选项速查
| 选项 | 功能 |
|---|---|
-i | 忽略大小写 |
-r / -R | 递归搜索目录 |
-n | 显示行号 |
-v | 反向匹配 |
-w | 匹配整个单词 |
-l | 只显示文件名 |
-c | 统计匹配行数 |
-C N | 显示前后N行上下文 |
-E | 扩展正则表达式(egrep) |
-F | 固定字符串,不解析正则(fgrep) |
locate适合快速找文件名,grep适合找文件内容。两者结合使用效率最高。