跳转到内容

grep

grep(Global Regular Expression Print)是 Linux 系统中强大的文本搜索工具,用于在文件或输入流中按模式搜索文本并输出包含匹配内容的行。支持基本/扩展正则表达式,可从文件或标准输入读取数据,支持多文件搜索和递归搜索。

Terminal window
grep [选项...] 匹配模式 [文件...]
  • 匹配模式:要查找的字符串或正则表达式
  • 文件:要查找的文件名,可以同时查找多个文件;省略则从标准输入读取数据

匹配模式的引号用法:

  • 单引号 'pattern':shell 不解析任何特殊字符,模式原样传递给 grep
  • 双引号 "pattern":shell 会解析变量($var)和命令替换($(cmd)),但不解析通配符;含 $、\ 等字符时需转义
  • 不加引号 pattern:shell 会进行分词和通配符扩展,仅适合不含特殊字符的简单模式

1. 匹配控制

选项 说明
-i 忽略大小写
-v 反向匹配,只输出不含模式的行
-w 精确匹配整词(相当于正则 '\bword\b')
-x 精确匹配整行(相当于正则 '^line$')

2. 输出控制

选项 说明
-n 显示匹配行的行号
-H 显示匹配行所在的文件名(多文件搜索时默认开启)
-h 不显示匹配行所在的文件名
-o 只输出匹配的部分,而非整行
-c 统计匹配的行数(而非输出内容)
-m <n> 找到 n 个匹配后停止搜索

3. 递归与文件筛选

选项 说明
-r 递归搜索目录下的所有文件
-R 与 -r 类似,但会跟随符号链接
--include=<GLOB> 只对文件名匹配 GLOB 的文件内容进行匹配
--exclude=<GLOB> 排除文件名匹配 GLOB 的文件
--exclude-dir=<GLOB> 排除文件名匹配 GLOB 的目录
--exclude-from=<FILE> 从指定 FILE 中读取多个 GLOB 模式来过滤文件(每行一个 GLOB)

4. 正则表达式相关

选项 说明
-F 将模式视为固定字符串(不解析正则表达式)
-G 使用基本正则表达式(默认,部分元字符如 |、+ 需要转义 \)
-E 使用扩展正则表达式(支持 |、()、+ 等元字符,无需转义)
-P 使用 Perl 兼容正则表达式(支持更多高级特性)

1. 基础用法

Terminal window
# 在 file.txt 中搜索包含 "error" 的行
grep "error" file.txt
# 从标准输入中搜索(例如结合管道)
cat file.txt | grep "warning"
# 搜索多个文件
grep "hello" file1.txt file2.txt

2. 匹配控制

Terminal window
# 忽略大小写搜索 "apple"
grep -i "apple" fruits.txt
# 输出不包含 "success" 的行
grep -v "success" result.log
# 精确匹配整词 "test"(不匹配 "testing" 或 "tests")
grep -w "test" report.txt
# 显示匹配行的行号
grep -n "error" app.log

3. 递归搜索

Terminal window
# 递归搜索当前目录下所有文件中包含 "function" 的行
grep -r "function" .
# 递归搜索时只包含 .py 文件,排除 .git 目录
grep -r --include="*.py" --exclude-dir=".git" "import" .

4. 正则表达式

Terminal window
# 基本正则:搜索以 "user_" 开头的行(^ 表示行首)
grep "^user_" config.txt
# 扩展正则:搜索包含 "error" 或 "warning" 的行(-E 支持 | 无需转义)
grep -E "error|warning" log.txt
# 只输出匹配的部分(例如提取所有邮箱地址)
grep -o "[A-Za-z0-9._%+-]\+@[A-Za-z0-9.-]\+\.[A-Za-z]\+" emails.txt

5. 统计与限制

Terminal window
# 统计文件中包含 "failed" 的行数
grep -c "failed" audit.log
# 找到 3 个匹配后停止搜索
grep -m 3 "error" large_file.log
# 显示匹配行及其前后各 2 行内容(上下文)
grep -C 2 "critical" system.log # -A 2 只显示后 2 行,-B 2 只显示前 2 行