grep — 搜索文本

grep 是强大的文本搜索工具,使用正则表达式在文件中搜索匹配模式。

命令说明

grep 在输入中搜索匹配指定模式的行并输出。它支持基本正则表达式(BRE)、扩展正则表达式(ERE)和固定字符串匹配。grep 是命令行中最重要的工具之一。

应用场景

  • 在代码中搜索函数定义
  • 过滤日志中的错误信息
  • 搜索配置文件中的设置项
  • 在管道输出中筛选数据
  • 统计匹配行数

常用示例

示例 1:在文件中搜索字符串

bash
复制代码
grep "error" application.log
plaintext
复制代码
2024-08-19 08:15:22 ERROR Database connection failed
2024-08-19 08:16:30 ERROR Retry attempt 1 failed
2024-08-19 08:17:45 ERROR Retry attempt 2 failed

示例 2:忽略大小写搜索

bash
复制代码
grep -i "warning" build.log

示例 3:递归搜索目录中的所有文件

bash
复制代码
grep -r "function main" project/
plaintext
复制代码
project/src/main.py:def main():
project/tests/test_main.py:def test_main():

示例 4:显示匹配行号

bash
复制代码
grep -n "TODO" src/*.py
plaintext
复制代码
src/main.py:23:    # TODO: Implement error handling
src/utils.py:45:    # TODO: Optimize this function

示例 5:使用正则表达式

bash
复制代码
grep -E "ERROR|FATAL" application.log

示例 6:只显示不匹配的行

bash
复制代码
grep -v "^#" config.ini

示例 7:统计匹配行数

bash
复制代码
grep -c "error" application.log
plaintext
复制代码
15

示例 8:只输出匹配的部分

bash
复制代码
grep -o "version=[0-9.]+" setup.py

示例 9:匹配整个单词

bash
复制代码
grep -w "main" program.c

help 参数详解

参数 长参数 说明
-i --ignore-case 忽略大小写
-v --invert-match 输出不匹配的行
-n --line-number 显示行号
-c --count 只输出匹配行数
-r --recursive 递归搜索目录
-l --files-with-matches 只输出包含匹配的文件名
-L --files-without-match 只输出不包含匹配的文件名
-w --word-regexp 匹配整个单词
-x --line-regexp 匹配整行
-E --extended-regexp 使用扩展正则表达式(支持 |+? 等)
-F --fixed-strings 使用固定字符串匹配(不解释正则)
-P --perl-regexp 使用 Perl 兼容正则表达式(PCRE)
-o --only-matching 只输出匹配的部分
-A N --after-context=N 显示匹配行之后的 N 行
-B N --before-context=N 显示匹配行之前的 N 行
-C N --context=N 显示匹配行前后的 N 行
-H --with-filename 显示文件名(多文件时默认行为)
-h --no-filename 不显示文件名
-q --quiet 静默模式,不输出任何内容(用于脚本判断)
-s --no-messages 抑制错误消息
-m N --max-count=N 每个文件最多输出 N 个匹配
--color 高亮显示匹配内容
--include=PATTERN 只搜索匹配模式的文件(如 --include='*.py'
--exclude=PATTERN 排除匹配模式的文件
--exclude-dir=PATTERN 排除匹配模式的目录