Grep 命令速查表
本速查表收录了 grep 及其变体 egrep/fgrep 最常用的操作,涵盖基础搜索、递归查找、上下文查看、正则匹配、输出格式化以及文件过滤等场景。适合日常文本搜索与日志分析。
基本操作 (Basic)
基础搜索语法与常用选项。
``bash
# 在文件中搜索字符串(区分大小写)
grep "error" app.log
# 忽略大小写搜索 grep -i "error" app.log
# 显示行号 grep -n "error" app.log
# 反向匹配(显示不包含的行) grep -v "debug" app.log
# 精确匹配整个单词 grep -w "error" app.log
# 精确匹配整行 grep -x "ERROR: Connection timeout" app.log
# 统计匹配行数 grep -c "error" app.log
# 只显示匹配的文件名 grep -l "error" *.log
# 显示不匹配的文件名 grep -L "error" *.log
# 只输出匹配的部分 grep -o "[0-9]\\+" app.log
# 限制匹配数量 grep -m 5 "error" app.log
# 静默模式(只返回退出码)
grep -q "pattern" file && echo "Found"
`
递归搜索 (Recursive Search)
在目录树中递归搜索文件。
`bash
# 递归搜索当前目录
grep -r "TODO" .
# 递归搜索(跟随符号链接) grep -R "TODO" /etc/
# 只显示文件名 grep -rl "function" src/
# 只显示文件名(反向) grep -rL "error" logs/
# 从文件读取模式 grep -f patterns.txt target.log
# 统计每个文件中的匹配数 grep -rc "import" src/
# 搜索多个模式 grep -e "ERROR" -e "FATAL" app.log
# 结合 find 使用
find . -name "*.py" -exec grep "def " {} +
`
上下文控制 (Context)
显示匹配行的前后文。
`bash
# 显示匹配后 2 行
grep -A 2 "Exception" stacktrace.log
# 显示匹配前 2 行 grep -B 2 "ERROR" app.log
# 显示匹配前后各 3 行 grep -C 3 "timeout" app.log
# 分组显示,用 -- 分隔每组 grep -C 2 "error" log.txt
# 高亮匹配内容
grep --color=always "pattern" file
`
正则表达式 (Regular Expression)
使用扩展正则和 Perl 兼容正则。
`bash
# 扩展正则表达式(ERE)
grep -E "[0-9]{3}-[0-9]{4}" phone.txt
# Perl 兼容正则(PCRE) grep -P "\\d{3}-\\d{4}" phone.txt
# 行首匹配 grep "^ERROR" app.log
# 行尾匹配 grep "done$" build.log
# 匹配多个字符之一 grep -E "gr[ae]y" colors.txt
# 匹配任意字符 grep "f..l" words.txt
# 匹配重复 grep -E "go+" pattern.txt
# 匹配可选字符 grep -E "colou?r" colors.txt
# 匹配特定数量 grep -E "\\d{3,5}" numbers.txt
# 单词边界 grep -E "\\berror\\b" text.txt
# 逻辑或匹配 grep -E "cat|dog|bird" animals.txt
# 忽略二进制文件
grep -I "text" binary_file
`
输出控制 (Output Control)
格式化和管理 grep 输出。
`bash
# 显示文件名(多文件时默认开启)
grep -H "pattern" file1 file2
# 不显示文件名 grep -h "pattern" file1 file2
# 空字节分隔输出(配合 xargs -0) grep -rlZ "pattern" . | xargs -0 rm
# 彩色输出(always/auto/never) grep --color=auto "pattern" file
# 静默模式,仅检查是否存在 grep -q "pattern" file && echo "exists"
# 输出对齐,使用 tab 分隔 grep -n "pattern" file
# 管道传送到其他命令 grep "error" app.log | cut -d' ' -f1
# 多个 grep 组合 grep "ERROR" app.log | grep -v "timeout" | head -20
# 在历史命令中搜索 history | grep "docker"
# 结合 wc 统计 grep -c "pattern" file.log
# 结合 sort 去重
grep -o "\\b[A-Z]\\+\\b" file | sort | uniq -c | sort -rn
`
文件过滤 (File Filtering)
控制 grep 搜索哪些文件和目录。
`bash
# 仅搜索特定文件类型
grep -r --include="*.py" "class" .
# 包含多种文件类型 grep -r --include="*.{js,ts}" "import" .
# 排除特定文件 grep -r --exclude="*.min.js" "function" .
# 排除特定文件(从文件读取) grep -r --exclude-from=ignore.txt "pattern" .
# 排除目录 grep -r --exclude-dir=node_modules "require" .
# 排除多个目录 grep -r --exclude-dir={node_modules,.git,dist} "pattern" .
# 仅搜索匹配 glob 的文件 grep -r --include="*.log" "ERROR" /var/log/
# 在二进制文件中搜索(显示文本部分) grep -a "text" binary.exe
# 不搜索二进制文件 grep -rI "pattern" . ``
基本操作(10)
| 命令 | 难度 | ||
|---|---|---|---|
grep "error" app.log在文件中搜索字符串(区分大小写) | 基础 | grep "error" app.log | |
grep -i "error" app.log忽略大小写搜索 | 基础 | grep -i "error" app.log | |
grep -n "error" app.log显示匹配行的行号 | 基础 | grep -n "error" app.log | |
grep -v "debug" app.log反向匹配,显示不包含模式的行 | 基础 | grep -v "debug" app.log | |
grep -w "error" app.log精确匹配整个单词 | 基础 | grep -w "error" app.log | |
grep -x "ERROR: Connection timeout" app.log精确匹配整行 | 中级 | grep -x "ERROR: Connection timeout" app.log | |
grep -l "error" *.log只显示包含匹配的文件名 | 基础 | grep -l "error" *.log | |
grep -L "error" *.log显示不包含匹配的文件名 | 中级 | grep -L "error" *.log | |
grep -q "pattern" file && echo "Found"静默模式,仅通过退出码判断是否匹配 | 中级 | grep -q "pattern" file && echo "Found" | |
grep -f patterns.txt target.log从文件中读取搜索模式列表 | 中级 | grep -f patterns.txt target.log |
输出控制(7)
| 命令 | 难度 | ||
|---|---|---|---|
grep -c "error" app.log统计匹配行数 | 基础 | grep -c "error" app.log | |
grep -o "[0-9]\\+" app.log只输出匹配的部分而非整行 | 中级 | grep -o "[0-9]\\+" app.log | |
grep -m 5 "error" app.log限制匹配输出数量 | 中级 | grep -m 5 "error" app.log | |
grep --color=always "pattern" file高亮显示匹配内容 | 基础 | grep --color=always "pattern" file | |
grep -H "pattern" file1 file2强制显示文件名 | 基础 | grep -H "pattern" file1 file2 | |
grep -h "pattern" file1 file2不显示文件名 | 基础 | grep -h "pattern" file1 file2 | |
grep -rlZ "pattern" . | xargs -0 rm空字节分隔输出,配合 xargs -0 处理特殊文件名 | 高级 | grep -rlZ "pattern" . | xargs -0 rm |
递归搜索(3)
| 命令 | 难度 | ||
|---|---|---|---|
grep -r "TODO" .递归搜索当前目录 | 基础 | grep -r "TODO" . | |
grep -R "TODO" /etc/递归搜索并跟随符号链接 | 中级 | grep -R "TODO" /etc/ | |
grep -rc "import" src/递归搜索并统计每个文件的匹配数 | 中级 | grep -rc "import" src/ |
正则(4)
| 命令 | 难度 | ||
|---|---|---|---|
grep -e "ERROR" -e "FATAL" app.log搜索多个模式(逻辑或) | 中级 | grep -e "ERROR" -e "FATAL" app.log | |
grep -E "[0-9]{3}-[0-9]{4}" phone.txt使用扩展正则表达式(ERE) | 中级 | grep -E "[0-9]{3}-[0-9]{4}" phone.txt | |
grep -P "\\d{3}-\\d{4}" phone.txt使用 Perl 兼容正则(PCRE) | 高级 | grep -P "\\d{3}-\\d{4}" phone.txt | |
grep -E "cat|dog|bird" animals.txt逻辑或匹配多个模式 | 中级 | grep -E "cat|dog|bird" animals.txt |
上下文(3)
| 命令 | 难度 | ||
|---|---|---|---|
grep -A 2 "Exception" stacktrace.log显示匹配后的 2 行上下文 | 基础 | grep -A 2 "Exception" stacktrace.log | |
grep -B 2 "ERROR" app.log显示匹配前的 2 行上下文 | 基础 | grep -B 2 "ERROR" app.log | |
grep -C 3 "timeout" app.log显示匹配前后各 3 行上下文 | 基础 | grep -C 3 "timeout" app.log |
文件过滤(6)
| 命令 | 难度 | ||
|---|---|---|---|
grep -r --include="*.py" "class" .仅搜索 Python 文件 | 中级 | grep -r --include="*.py" "class" . | |
grep -r --exclude="*.min.js" "function" .排除匹配 glob 的文件 | 中级 | grep -r --exclude="*.min.js" "function" . | |
grep -r --exclude-dir=node_modules "require" .排除指定目录 | 中级 | grep -r --exclude-dir=node_modules "require" . | |
grep -r --exclude-dir={node_modules,.git,dist} "pattern" .排除多个目录 | 中级 | grep -r --exclude-dir={node_modules,.git,dist} "pattern" . | |
grep -I "text" binary_file忽略二进制文件 | 中级 | grep -I "text" binary_file | |
grep -a "text" binary.exe在二进制文件中搜索(视为文本) | 高级 | grep -a "text" binary.exe |