第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 keyword

9.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/passwd

9.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 不会匹配 thereother


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适合找文件内容。两者结合使用效率最高。


Linux Shell 查找 locate grep 搜索 正则表达式